主要的六个概念:
流程定义 流程实例 流程变量 任务 起始结束 网关
ProcessEngine 线程安全 是Activiti5的核心,所有的服务都需要通过ProcessEngine来创建
Activiti5的持久化层采用的是Mybatis
通过ProcessEngine创建的7个service:
repositoryService(持久化服务) 与数据库进行交互的
runtimeService(运行时服务) 与运行流程有关
formService(表单服务)
identityService(身份信息)
taskService(任务服务) 与流程中的每一个步骤有关
historyService(历史信息) 查看历史的流程步骤
managementService(管理定时任务)在固定的时间点完成固定的任务
**
表结构
**
act_ge_bytearray二进制数据表
act_ge_property属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录,
act_hi_actinst历史节点表 ****
act_hi_attachment历史附件表
act_hi_comment历史意见表
act_hi_identitylink历史流程人员表
act_hi_detail历史详情表,提供历史变量的查询
act_hi_procinst历史流程实例表****
act_hi_taskinst历史任务实例表****
act_hi_varinst历史变量表
act_id_group用户组信息表
act_id_info用户扩展信息表
act_id_membership用户与用户组对应信息表
act_id_user用户信息表
act_re_deployment部署信息表
act_re_model流程设计模型部署表
act_re_procdef流程定义数据表
act_ru_event_subscr throwEvent、catchEvent时间监听信息表
act_ru_execution运行时流程执行实例表****
act_ru_identitylink运行时流程人员表,主要存储任务节点与参与者的相关信息
act_ru_job运行时定时任务数据表
act_ru_task运行时任务节点表
act_ru_variable运行时流程变量数据表
act_ge_bytearray二进制数据表
act_ge_property属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录,
act_hi_actinst历史节点表
act_hi_attachment历史附件表
act_hi_comment历史意见表
act_hi_identitylink历史流程人员表
act_hi_detail历史详情表,提供历史变量的查询
act_hi_procinst历史流程实例表
act_hi_taskinst历史任务实例表
act_hi_varinst历史变量表
act_id_group用户组信息表
act_id_info用户扩展信息表
act_id_membership用户与用户组对应信息表
act_id_user用户信息表
act_re_deployment部署信息表
act_re_model流程设计模型部署表
act_re_procdef流程定义数据表
act_ru_event_subscr throwEvent、catchEvent时间监听信息表
act_ru_execution运行时流程执行实例表
act_ru_identitylink运行时流程人员表,主要存储任务节点与参与者的相关信息
act_ru_job运行时定时任务数据表
act_ru_task运行时任务节点表****
act_ru_variable运行时流程变量数据表
**
基本使用
配置好后 可以直接注入对象使用
**
(1)部署: 在process文件夹下放bpmn文件
Deployment deploy = repositoryService.createDeployment().addClasspathResource("文件.bpmn").deploy();
部署后:
1act_ge_bytearray表
二进制数据表,存储了流程定义图形的XML文件和图片信息
保存流程定义的xml信息
保存流程定义的图片
2.act_re_deployment
部署信息表,存储了部署的相关信息(部署时间)
3.act_re_procdef
流程定义数据表,存储了当前流程图形的相关信息(id,name,版本号)
如果有乱码:
@Configuration
public class ActivitiConfig implements ProcessEngineConfigurationConfigurer{
@Override
public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
processEngineConfiguration.setActivityFontName("宋体");
processEngineConfiguration.setLabelFontName("宋体");
}
}
查询流程部署数据:
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
/*List<ProcessDefinition> list = query.list();
for (ProcessDefinition pd : list) {
System.out.println(pd.getId() +" - " + pd.getName() + " - " + pd.getVersion());
}*/
long count = query.count(); //流程定义的数量
//ProcessDefinition singleResult = query.latestVersion().singleResult();//获取最后一次部署的流程定义对象
//System.out.println(singleResult.getId() +" - " + singleResult.getName() + " - " + singleResult.getVersion());
/*ProcessDefinitionQuery processDefinitionQuery = query.orderByProcessDefinitionVersion().desc();//根据版本号进行倒序排序
List<ProcessDefinition> list2 = processDefinitionQuery.list();
for (ProcessDefinition pd : list2) {
System.out.println("---"+pd.getId() +" - " + pd.getName() + " - " + pd.getVersion());
}*/
//query.listPage(firstResult, maxResults);//分页的方法
ProcessDefinition singleResult = query.processDefinitionKey("myProcess").latestVersion().singleResult();
System.out.println(singleResult.getId() +" - " + singleResult.getName() + " - " + singleResult.getVersion());
(2)启动流程实例:
//查询流程定义
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionKey("你的key")
.latestVersion()
.singleResult();
//运行启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
//可以进行输出
相关表哥:
act_ru_execution : 运行时流程执行实例表
act_ru_task : 运行时任务节点表
act_hi_procinst : 历史流程实例表
act_hi_taskinst : 历史任务实例表
act_hi_actinst : 历史节点列表,把每一个执行过的节点数据保存
(3)获取流程任务
TaskQuery taskQuery = taskService.createTaskQuery();
List<Task> list1 = taskQuery.taskAssignee("名字").list();
List<Task> list2 = taskQuery.taskAssignee("名字").list();
for (Task task : list1) {
System.out.println("1的任务="+task.getName());
}
for (Task task : list2) {
System.out.println("2的任务="+task.getName());
}
(4)查询并完成任务:
TaskQuery taskQuery = taskService.createTaskQuery();
List<Task> list1 = taskQuery.taskAssignee("1").list();
List<Task> list2 = taskQuery.taskAssignee("2").list();
for (Task task : list1) {
System.out.println("1的任务="+task.getName());
taskService.complete(task.getId());
}
(5)历史任务:
//查询流程定义
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionKey("你的key")
.latestVersion()
.singleResult();
HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery();
HistoricProcessInstance historicProcessInstance =
query.processInstanceId("401").finished().singleResult();
//HistoricProcessInstanceEntity[superProcessInstanceId=null]
//finished() 判断流程实例是否完成状态,如果是完成状态会返回历史流程实例对象,否则为null
(6)对任务进行领取:
TaskQuery taskQuery = taskService.createTaskQuery();
List<Task> list = taskQuery.taskCandidateGroup("组名字").list();
for (Task task : list) {
taskService.claim(task.getId(), "人"); //领取任务
}
(7)采用流程变量获取委托人:
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionKey("key")
.latestVersion()
.singleResult();
Map<String,Object> variables = new HashMap<String,Object>();
variables.put("设置好的流程变量1", "人1");
variables.put("设置好的流程变量2", "人2");
//ProcessInstance processInstance =
runtimeService.startProcessInstanceById(processDefinition.getId());
ProcessInstance processInstance =
runtimeService.startProcessInstanceById(processDefinition.getId(),variables);
System.out.println(processInstance);
(8)排他网关: 多个分支只能有一个被执行
Deployment deploy =
repositoryService.createDeployment().addClasspathResource("你的文件.bpmn").deploy();
System.out.println(deploy);
//查询流程定义
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("key")
.latestVersion()
.singleResult();
//准备流程变量
Map<String,Object> variables = new HashMap<String,Object>();
variables.put("days", 3);
//启动流程,传递流程变量
ProcessInstance processInstance =
runtimeService.startProcessInstanceById(processDefinition.getId(),variables);
List<Task> list = taskService.createTaskQuery().taskAssignee("任命").list();
for (Task task : list) {
taskService.complete(task.getId());
}
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstance.getId())
.finished()
.singleResult();
并行网关:多个分支同时都被执行,流程才能往后执行 ,称为并行网关
Deployment deploy =
repositoryService.createDeployment().addClasspathResource("文件.bpmn").deploy();
//查询流程定义
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionKey("key")
.latestVersion()
.singleResult();
//启动流程,传递流程变量
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
List<Task> list1 = taskService().createTaskQuery().taskAssignee("人1").list();
List<Task> list2 = taskService().createTaskQuery().taskAssignee("人2").list();
for (Task task : list1) {
taskService().complete(task.getId());
}
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstance.getId())
.finished()
.singleResult();
for (Task task : list2) {
processEngine.getTaskService().complete(task.getId());
}
historicProcessInstance = historyService()
.createHistoricProcessInstanceQuery()
.processInstanceId(processInstance.getId())
.finished()
.singleResult();
包含网关 :相当于 排他 加 并行网关
如果当前条件只有一个成立则执行后续流程-相当于排他网关
如果当前所有条件成立,则必须所有条件成立的任务完成才会执行后续流程-相当于并行网关
Deployment deploy = repositoryService.createDeployment().addClasspathResource("文件.bpmn").deploy();
//查询流程定义
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionKey("key")
.latestVersion()
.singleResult();
//准备流程变量
Map<String,Object> variables = new HashMap<String,Object>();
//variables.put("days", 5);//条件:days>3
//variables.put("cost", 100); //条件:cost>5000
variables.put("days", 5);//条件:days>3
variables.put("cost", 10000); //条件:cost>5000
//启动流程,传递流程变量
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(),variables);
List<Task> list = taskService.createTaskQuery().taskAssignee("人1").list();
for (Task task : list) {
taskService.complete(task.getId());
}
HistoricProcessInstance historicProcessInstance =historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstance.getId())
.finished()
.singleResult();
(9)流程监听器:
写两个类实现 ExecutionListener
选择结束节点 加监听器
//部署流程
ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey("key");
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskAssignee("人1").list();
for ( Task task : tasks ) {
taskService.setVariable(task.getId(), "flg", false);
taskService.complete(task.getId());
}
、、