HelloWorld
做一个最简单的HellWorld流程用代码的方式实现并且走完流程。
以下是涉及到的比较重要的八张表
SELECT * FROM act_re_deployment; -- 一 流程部署表
SELECT * FROM act_ge_bytearray; -- 二 流程二进制表
SELECT * FROM act_re_procdef; -- 三 流程定义表
SELECT * FROM act_ru_execution; -- 四 流程正在运行表
SELECT * FROM act_hi_procinst; -- 五 流程实例历史表
SELECT * FROM act_ru_task; -- 六 流程当前任务表
SELECT * FROM act_hi_taskinst; -- 七 流程历史任务表
SELECT * FROM act_hi_actinst; -- 八 流程历史活动节点表
相关步骤如下:
1.首先是需要部署流程定义。
2.启动流程实例。
3.查看流程任务以及完成流程任务。
先决工作,成员变量定义
获取流程实例引擎ProcessEngines;
获取RepositoryService;
获取RuntimeService;
获取TaskService;
获取HistoryService
/**
* 获取默认的流程引擎实例 会自动读取activiti.cfg.xml文件
*/
private ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
//定义一个成员变量
RepositoryService repositoryService;
RuntimeService runtimeService;
TaskService taskService;
HistoryService historyService;
/**
* 获取流程引擎
*/
@Before
public void setUp() throws Exception {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
repositoryService = processEngine.getRepositoryService();
runtimeService = processEngine.getRuntimeService();
taskService = processEngine.getTaskService();
historyService = processEngine.getHistoryService();
}
部署流程定义图:
/**
* 部署流程定义
*/
@Test
public void deploy(){
// 获取部署对象
Deployment deployment=processEngine.getRepositoryService() // 部署Service
.createDeployment() // 创建部署
.addClasspathResource("diagrams/MyProcess.bpmn") // 加载资源文件
// .addClasspathResource("diagrams/helloWorld.png") // 加载资源文件
// .name("HelloWorld流程") // 流程名称
.deploy(); // 部署
System.out.println("流程部署ID:"+deployment.getId());
System.out.println("流程部署Name:"+deployment.getName());
}
执行结果:
流程部署ID:17501
流程部署Name:null
接着启动流程实例,这样一个流程才开始:
/**
* 启动流程
*/
@Test
public void startProcess() {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");
String processInstanceId = processInstance.getId();
String activityId = processInstance.getActivityId();
String definitionId = processInstance.getProcessDefinitionId();
System.out.println("流程实例ID:"+processInstanceId);
System.out.println("正在活动的节点ID:"+activityId);
System.out.println("流程定义ID:"+definitionId);
}
执行结果:
流程实例ID:20001
正在活动的节点ID:usertask1
流程定义ID:myProcess:2:17504
查询正在运行的实例:
/**
* 查询正在运行的实例
*/
@Test
public void queryExecution(){
List executionList = runtimeService.createExecutionQuery() //创建正在执行的流程查询对象
.processDefinitionKey("myProcess") //根据流程定义的key查询
.orderByProcessInstanceId() //根据流程实例id排序
.desc() //倒序
.list(); //查询出集合
for(Execution execution: executionList){
System.out.println("正在执行的流程对象的id: "+execution.getId());
System.out.println("所属流程实例的id:"+execution.getProcessInstanceId());
System.out.println("正在活动的节点的id: "+execution.getActivityId());
System.out.println("任务名称: "+execution.getName());
}
}
执行结果:
正在执行的流程对象的id: 20001
所属流程实例的id:20001
正在活动的节点的id: usertask1
任务名称: null
查看一下白夜行这个用户的任务信息:
/**
* 根据办理人查询任务
*/
@Test
public void queryTaskByAssignee(){
String assignee = "白夜行"; // assignee 要与流程图上的 Assignee 相同才会被查询到,否则就不返回该任务对象
// 查询并且返回任务即可
List taskList = taskService.createTaskQuery() // 任务相关Service // 创建任务查询
.processDefinitionKey("myProcess")
.taskAssignee(assignee)// 指定某个人
.orderByTaskCreateTime()
.desc()
.list();
for(Task task: taskList){
System.out.println("任务ID:"+task.getId());
System.out.println("任务名称:"+task.getName());
System.out.println("任务创建时间:"+task.getCreateTime());
System.out.println("任务委派人:"+task.getAssignee());
System.out.println("流程实例ID:"+task.getProcessInstanceId());
}
}
执行结果:
任务ID:20004
任务名称:myprocess
任务创建时间:Thu Mar 12 10:02:57 CST 2020
任务委派人:白夜行
流程实例ID:20001
查询当前流程实例状态
/**
* 查询当前流程实例状态
*/
@Test
public void queryProInstanceStateByProInstanceId(){
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("12501").singleResult();
if(processInstance == null){
System.out.println("当前流程已经完成");
}else{
System.out.println("当前流程实例ID:"+processInstance.getId());
System.out.println("当前流程所处的位置:"+processInstance.getActivityId());
}
}
执行结果:
当前流程实例ID:20001
当前流程所处的位置:usertask1
最后完成HelloWorld节点任务,把流程走完:
/**
* 完成任务
*/
@Test
public void completeTask(){
TaskQuery query = taskService.createTaskQuery(); //创建任务查询对象
List list = query.processDefinitionKey("myProcess") //指定流程定义
.taskAssignee("白夜行") //指定委托人
.list(); //执行查询
for (Task task : list) {
System.out.println(task);
//taskService某些框架下需要使用@Autowired注解装配
taskService.complete(task.getId()); //完成任务,使任务进入下一步
}
}
查询流程实例历史
/**
* 查询流程实例历史
*/
@Test
public void queryHistory(){
//1.创建流程实例的历史查询对象,historyService使用@Autowired注解注入
HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery();
HistoricProcessInstance instance =
query
.processInstanceId("12501") //流程实例的id
.finished() //调用这个方法后未完成的流程实例会返回null
.singleResult();
System.out.println(instance);
}
这里引出一个概念,流程定义和流程实例的关系,可以把这两种关系理解成是类和对象的关系。
流程定义是一个模板,而流程实例就是通过模板演变出来的具体的可用的东西。
首先当运行:deploy()部署流程定义方法,在数据库中流程定义表会发生一些变化新增了一条数据,
act_re_deployment流程定义部署表:
然后act_re_prodef流程定义表也会有一条数据插入:
以及在act_ge_bytearray表中用来存储资源信息:
接着来运行start()启动流程实例:
act_ru_task运行时流程任务表新增了一条数据:
act_ru_execution 运行时流程执行表:
act_ru_identitulink是用于执行主体相关信息表:
可以查看刚刚"白夜行”这个用户的任务:
运行findTask()查看用户任务,控制台输出如下:
任务ID:20004
任务名称:myprocess
任务创建时间:Thu Mar 12 10:02:57 CST 2020
任务委派人:白夜行
流程实例ID:20001
completeTask()方法完成任务:
然后数据库中ru开头的运行时候所有表的数据都没了,因为现在流程结束,不需要这些数据了。
在hi开头的表里,会新增不少数据,这些数据主要是用来归档查询用的,也就是历史数据。
act_hi_taskinst 历史流程实例任务表加了一条任务数据;
act_hi_procinst 历史流程实例实例表加了一条流程实例相关信息的数据(包括开始时间,结束时间等等信息);
act_hi_identitylink 历史流程实例参数者的表加了一条数据;
act_hi_actinst 历史活动节点表加了三条流程活动节点信息的数据(每个流程实例具体的执行活动节点的信息);
转载自 :Activity-(五)HelloWorld实现