项目: cn.itcast.c_processInstance
1. 流程核心对象-流程引擎: ProcessEngine
2. 部署流程的定义(通过zip)
@Test
public void deploymentProcessDefinition_zip(){
InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
Deployment deployment = processEngine.getRepositoryService()// 与流程定义和部署对象相关的Service
.createDeployment()// 创建一个部署对象
.name("流程定义")// 添加部署名称
.addZipInputStream(zipInputStream)// 指定zip格式的文件完成部署
.deploy();// 完成部署
System.out.println("部署ID: " + deployment.getId());
System.out.println("部署名称: " + deployment.getName());
}
部署对象和流程定义相关的表
act_re_deployment 部署对象表
act_re_procdef 流程定义表
act_ge_bytearray 资源文件表
act_ge_property 主键生成策略表
3. 启动流程实例
@Test
public void startProcessInstance(){
// 流程定义的key(可查看流程定义表)
String processDefinitionKey = "helloworld";
ProcessInstance pi = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
// 使用流程定义的key启动流程实例, key对应helloworld.bpmn文件中id的属性值
.startProcessInstanceBykey(processDefinitionKey);
System.out.println("流程实例ID: " + pi.getId());// 流程实例ID 1001(?到底是执行对象ID还是流程实例ID(PROC_INST_ID))
System.out.println("流程定义ID: " + pi.getProcessDefinitionId());// 流程定义ID helloworld:1:4
}
- 注1: 不采用流程实例ID启动, 是因为key是个定值, ID是个生成值, 且使用key启动会默认启动最新版本.
流程实例, 执行对象, 任务相关表
act_ru_execution 正在执行的执行对象表
act_hi_procinst 流程实例的历史表
act_ru_task 正在执行的任务表(只有节点是UserTask的时候, 该表存在数据)
act_hi_taskinst 历史任务表(只有节点是UserTask的时候, 该表存在数据, 包含完成和未完成的)
act_hi_actinst 所有活动节点的历史表(相对历史任务表, 包括非任务节点)
- 注2: 查询act_ru_execution发现ID(执行对象ID) 和 PROC_INST_ID(流程实例ID) 两字段相同, 但其实实际情况 并不一定相同 1.
-
流程实例 processInstance
和执行对象 execution
:
-
流程实例的历史表 act_hi_procinst
结构:
-
正在执行的
任务表 act_ru_task
的表结构:
-
历史任务表 act_hi_taskinst
的表结构:
所有活动节点的历史表 act_hi_actinst
的表结构:
4. 查询当前人的个人任务
public void findMyPersonalTask(){
String assignee = "王五";
List<Task> list = processEngine.getTaskService()// 与正在执行的任务管理相关的Service
.createTaskQuery()// 创建任务查询对象
/** 查询条件(where部分) */
.taskAssignee(assignee)// 指定个人任务查询, 指定办理人
//.taskCandidateUser(assignee)// 组任务办理人查询
//.processDefinitionId(processDefinitionId)// 使用流程定义ID查询
//.processInstanceId(processInstanceId)// 使用流程实例ID查询
//executionId(executionId)// 使用执行对象ID查询
/** 排序 */
//.orderBy*().asc()// 按照*升序
/** 返回结果集 */
//.singleResult()// 返回唯一结果集
//.count()// 返回结果集的数量
//.listPage(firstResult, maxResults)// 分页查询
.list();// 返回列表
if (list != null && list.size() > 0) {
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());
System.out.println("执行对象ID: " + task.getExecutionId());
System.out.println("流程定义ID: " + task.getProcessDefinitionId());
}
}
5. 完成我的任务
public void completeMyPersonalTask() {
// 任务ID
String taskId = "1004";
processEngine.getTaskService()// 与正在执行的任务管理相关的Service
.complete(taskId);
System.out.println("完成任务! 任务ID: " + taskId);
}
6. 查询流程状态(判断流程正在执行, 还是结束了)
public void getProcessStatus() {
String processInstanceId = "1001";
ProcessInstance pi = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象有关的service
.createProcessInstanceQuery()// 创建流程实例查询
.processInstanceId(processInstanceId)// 使用流程实例ID查询
.singleResult();
if (pi == null) {
System.out.println("流程已经结束.");
} else {
System.out.println("流程正在执行.");
}
}
7. 查询历史任务
public void getHistoryTask() {
String taskAssignee = "张三";
List<HistoricTaskInstance> list = processEngine.getHistoryService()// 与历史数据(历史表)相关的service
.createHistoricTaskInstanceQuery()// 创建历史任务实例查询
.taskAssignee(taskAssignee)// 指定历史任务的办理人
.list();
if (list != null) {
for (HistoricTaskInstance hti : list) {
System.out.println(hti.getId());
System.out.println(hti.getName());
System.out.println(hti.getProcessInstanceId());
System.out.println(hti.getStartTime());
System.out.println(hti.getEndTime());
System.out.println(hti.getDurationInMillis());
}
}
}
8. 查询历史流程实例
public void getHistoryProcessInstance() {
String processInstanceId = "1001";
HistoricProcessInstance hpi = processEngine.getHistoryService()// 与历史数据(历史表)相关的Service
.createHistoricProcessInstanceQuery()//创建历史流程实例查询
.processInstanceId(processInstanceId)// 使用流程实例ID查询
.singleResult();
System.out.println(hpi.getId());// 流程实例ID
System.out.println(hpi.getProcessDefinitionId());// 流程定义ID
System.out.println(hpi.getStartTime());
System.out.println(hpi.getEndTime());
System.out.println(hpi.getDurationInMillis());// 持续毫秒数
}
如果是单例流程(没有分支和聚合), 那么
流程实例ID
和执行对象ID
是相同的.
另: 一个流程流程实例 processInstance(PROC_INST_ID)
只有一个,执行对象 execution(ID)
可以存在多个. ↩︎