热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java工作流activiti官网quickstart(part2)

2019独角兽企业重金招聘Python工程师标准接上篇:java工作流activiti官网quickstart(part1)5.RunProcessInstan

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

接上篇:java 工作流 activiti 官网 quick start(part 1)

5. Run Process Instance

Deployed processes can use the Activiti API to initiate, run, view history, and otherwise manage process instances. This Quick Start run process instances using Java code.(已部署的流程可以使用Activiti API启动、运行、查看历史记录,或者管理流程实例。这个快速启动使用Java代码运行流程实例。)

See Sample Onboarding Quick Start for an example of managing Process Instances using Restful Services.

Set the logging level of Activiti from DEBUG to WARN as illustrated in line 1 below.(log的级别从debug改成了warn)

File: $mvnProject/src/main/resources/log4j.properties

log4j.rootLogger=WARN, ACTlog4j.appender.ACT=org.apache.log4j.ConsoleAppender
log4j.appender.ACT.layout=org.apache.log4j.PatternLayout
log4j.appender.ACT.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n

Important:  The following example code illustrates the flexibility and powerful of Activiti’s standards-based embeddable Process Engine. However, this code does not represent itself as best practices in terms of error handling, code organization, and general design. Rather, the purpose is to illustrate many ideas quickly so to gain familiarity with the power of Activiti. Re-factor the below example for your own needs.(下面的例子只是个用于演示的例子别太较真,后续掌握了后可以随意玩)

Add to OnboardingRequest.java as illustrated below:

File: $mvnProject/src/main/java/com/example/OnboardingRequest.java

package com.example;import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.form.FormData;
import org.activiti.engine.form.FormProperty;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration;
import org.activiti.engine.impl.form.DateFormType;
import org.activiti.engine.impl.form.LongFormType;
import org.activiti.engine.impl.form.StringFormType;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;public class OnboardingRequest {public static void main(String[] args) throws ParseException {ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration().setJdbcUrl("jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000").setJdbcUsername("sa").setJdbcPassword("").setJdbcDriver("org.h2.Driver").setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);ProcessEngine processEngine = cfg.buildProcessEngine();String pName = processEngine.getName();String ver = ProcessEngine.VERSION;System.out.println("ProcessEngine [" + pName + "] Version: [" + ver + "]");RepositoryService repositoryService = processEngine.getRepositoryService();Deployment deployment = repositoryService.createDeployment().addClasspathResource("onboarding.bpmn20.xml").deploy();ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();System.out.println("Found process definition [" + processDefinition.getName() + "] with id [" + processDefinition.getId() + "]");RuntimeService runtimeService = processEngine.getRuntimeService();ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("onboarding");System.out.println("Onboarding process started with process instance id [" + processInstance.getProcessInstanceId()+ "] key [" + processInstance.getProcessDefinitionKey() + "]");TaskService taskService = processEngine.getTaskService();FormService formService = processEngine.getFormService();HistoryService historyService = processEngine.getHistoryService();Scanner scanner = new Scanner(System.in);while (processInstance != null && !processInstance.isEnded()) {List tasks = taskService.createTaskQuery().taskCandidateGroup("managers").list();System.out.println("Active outstanding tasks: [" + tasks.size() + "]");for (int i = 0; i variables = new HashMap();FormData formData = formService.getTaskFormData(task.getId());for (FormProperty formProperty : formData.getFormProperties()) {if (StringFormType.class.isInstance(formProperty.getType())) {System.out.println(formProperty.getName() + "?");String value = scanner.nextLine();variables.put(formProperty.getId(), value);} else if (LongFormType.class.isInstance(formProperty.getType())) {System.out.println(formProperty.getName() + "? (Must be a whole number)");Long value = Long.valueOf(scanner.nextLine());variables.put(formProperty.getId(), value);} else if (DateFormType.class.isInstance(formProperty.getType())) {System.out.println(formProperty.getName() + "? (Must be a date m/d/yy)");DateFormat dateFormat = new SimpleDateFormat("m/d/yy");Date value = dateFormat.parse(scanner.nextLine());variables.put(formProperty.getId(), value);} else {System.out.println("");}}taskService.complete(task.getId(), variables);HistoricActivityInstance endActivity = null;List activities = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstance.getId()).finished().orderByHistoricActivityInstanceEndTime().asc().list();for (HistoricActivityInstance activity : activities) {if (activity.getActivityType() == "startEvent") {System.out.println("BEGIN " + processDefinition.getName() + " [" + processInstance.getProcessDefinitionKey()+ "] " + activity.getStartTime());}if (activity.getActivityType() == "endEvent") {// Handle edge case where end step happens so fast that the end step// and previous step(s) are sorted the same. So, cache the end step //and display it last to represent the logical sequence.endActivity = activity;} else {System.out.println("-- " + activity.getActivityName() + " [" + activity.getActivityId() + "] "+ activity.getDurationInMillis() + " ms");}}if (endActivity != null) {System.out.println("-- " + endActivity.getActivityName() + " [" + endActivity.getActivityId() + "] "+ endActivity.getDurationInMillis() + " ms");System.out.println("COMPLETE " + processDefinition.getName() + " ["+ processInstance.getProcessDefinitionKey() + "] " + endActivity.getEndTime());}}// Re-query the process instance, making sure the latest state is availableprocessInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();}scanner.close();}
}

Package up your code by running “mvn package”.(用IDE直接跑main,简单粗暴)

Run your Java program as before. Notice Sample output noted below.

Command: java -jar target/ActivitiDeveloperQuickStart-0.0.1-SNAPSHOT-jar-with-dependencies.jar

-or-

java -jar target/$quickStartJavaProjectName-0.0.1-SNAPSHOT-jar-with-dependencies.jar

Base Path: $mvnProject

先跑一个2年的

com.example.OnboardingRequest
ProcessEngine [default] Version: [6.0.0.4]
Found process definition [Onboarding] with id [onboarding:1:4]
Onboarding process started with process instance id [5] key [onboarding]
Active outstanding tasks: [1]
Processing Task [Enter Data]
Full Name?
wxx
Years of Experience? (Must be a whole number)
2
-- Start [startOnboarding] 2 ms
-- Years of Experience [decision] 0 ms
-- Enter Data [enterOnboardingData] 12473 ms
-- Generic and Automated Data Entry [automatedIntro] 163 ms
-- End [endOnboarding] 0 msProcess finished with exit code 0

Notes:

  • Observe that 2 years-experience sees the process path following the Script Task “Generic and Automated Data Entry” after the “Years of Experience” decision then the process ends.(注意的是紧随判断后的是Generic and Automated Data Entry)

再跑一个5年的

ProcessEngine [default] Version: [6.0.0.4]
Found process definition [Onboarding] with id [onboarding:1:4]
Onboarding process started with process instance id [5] key [onboarding]
Active outstanding tasks: [1]
Processing Task [Enter Data]
Full Name?
Simon
Years of Experience? (Must be a whole number)
5
-- Start [startOnboarding] 16 ms
-- Enter Data [enterOnboardingData] 12887 ms
-- Years of Experience [decision] 7 ms
Active outstanding tasks: [1]
Processing Task [Personalized Introduction and Data Entry]
Personal Welcome Time? (Must be a date m/d/yy)

 

Notes:

  • Observe that 5 years-experience sees the process path following the user Task “Personalized Introduction and Data Entry” after the “Years of Experience” decision. The then the process ends.(注意的是紧随判断后的是Personalized Introduction and Data Entry)

While simple, this embedded example shows how your applications externalizing process logic into a standards-based modeling and code-friendly development model.(虽然简单,但是这个嵌入式的例子展示了你的程序如何把处理逻辑 抽取 到 标准化建模和 代码友好的开发模型)


转:https://my.oschina.net/u/3301706/blog/3034364



推荐阅读
author-avatar
欢不是欢7
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有