Activiti是一个工作流引擎
关键表
ACT_RE:流程定义和流程静态资源 (图片,规则)
ACT_RE_DEPLOYMENT:部署单元信息deployment
ACT_RE_MODEL:模型信息
ACT_RE_PROCDEF:已部署的流程定义
ACT_RU:运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据
ACT_RU_EVENT_SUBSCR:运行时事件
ACT_RU_EXECUTION:运行时流程执行实例
ACT_RU_IDENTITYLINK:运行时用户关系信息,存储任务节点与参与者的相关信息
ACT_RU_JOB:运行时作业
ACT_RU_TASK:运行时任务
ACT_RU_VARIABLE:运行时变量表
ACT_HI:包含历史数据,比如历史流程实例,变量,任务
ACT_HI_ACTINST:历史的流程实例
ACT_HI_ATTACHMENT:历史的流程附件
ACT_HI_COMMENT:历史的说明性信息
ACT_HI_DETAIL:历史的流程运行中的细节信息
ACT_HI_IDENTITYLINK:历史的流程运行过程中用户关系
ACT_HI_PROCINST:历史的流程实例
ACT_HI_TASKINST:历史的任务实例
ACT_HI_VARINST:历史的流程运行中的变量信息
ACT_GE: 通用数据, 用于不同场景下
ACT_GE_BYTEARRAY:通用的流程定义和流程资源
ACT_GE_PROPERTY:系统相关属性
引擎创建
//先构建ProcessEngineConfiguration
ProcessEngineConfiguration configuration = ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//通过ProcessEngineConfiguration创建ProcessEngine,此时会创建数据库
ProcessEngine processEngine = configuration.buildProcessEngine();
获取service
RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();
Service总览
RepositoryService:资源管理类
提供了管理和控制流程发布和流程定义的操作
RuntimeService:流程运行管理类
获取很多关于流程执行相关的信息
TaskService:任务管理类
获取任务的信息。
HistoryService:历史管理类
查询历史信息,流程实例启动时间,任务的参与者, 完成任务的时间,每个流程实例的执行路径
ManagerService:引擎管理类
管理和维护功能
定义流程
.bpmn文件
事件Event
活动Activity
网关GateWay
流向Flow
流程部署
RepositoryService
//使用RepositoryService进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bpmn/evection.bpmn") // 添加bpmn资源
.addClasspathResource("bpmn/evection.png") // 添加png资源
.name("出差申请流程")
.deploy();
流程定义部署后操作activiti的3张表如下:
act_re_deployment:流程定义部署表,每部署一次增加一条记录
act_re_procdef:流程定义表,部署每个新的流程定义都会在这张表中增加一条记录
act_ge_bytearray:流程资源表
启动流程
//2、获取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//3、根据流程定义Id(定义流程的时候指定)启动流程
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey("myEvection");
操作数据表
act_hi_actinst 流程实例执行历史
act_hi_identitylink 流程的参与用户历史信息
act_hi_procinst 流程实例历史信息
act_hi_taskinst 流程任务历史信息
act_ru_execution 流程执行信息
act_ru_identitylink 流程的参与用户信息
act_ru_task 任务信息
查询任务
任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。
//创建TaskService
TaskService taskService = processEngine.getTaskService();
//根据流程key 和 任务负责人 查询任务
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey("myEvection") //流程Key
taskAssignee("用户名")//只查询该任务负责人的任务
.list();
处理流程任务:
//根据流程key 和 任务的负责人 查询任务
//返回一个任务对象
Task task = taskService.createTaskQuery()
.processDefinitionKey("myEvection") //流程Key
.taskAssignee("zhangsan") //要查询的负责人
.singleResult();
//完成任务,参数:任务id
taskService.complete(task.getId());
流程定义信息查询
//得到ProcessDefinitionQuery 对象
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//查询出当前所有的流程定义
//条件:processDefinitionKey =evection
//orderByProcessDefinitionVersion 按照版本排序
//desc倒叙
//list 返回集合
List<ProcessDefinition> definitionList = processDefinitionQuery.processDefinitionKey("myEvection")
.orderByProcessDefinitionVersion()
.desc()
.list();
删除流程
// 通过流程引擎获取repositoryService
RepositoryService repositoryService = processEnginegetRepositoryService();
//删除流程定义,如果该流程定义已有流程实例启动则删除时出错
repositoryService.deleteDeployment(deploymentId);
//设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式,如果流程
//repositoryService.deleteDeployment(deploymentId, true);
下载流程资源
//1、得到引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//3、得到查询器:ProcessDefinitionQuery,设置查询条件,得到想要的流程定义
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("myEvection")
.singleResult();
/4、通过流程定义信息,得到部署ID
String deploymentId = processDefinition.getDeploymentId();
//5、通过repositoryService的方法,实现读取图片信息和bpmn信息
//png图片的流
InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
//bpmn文件的流
InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
//6、构造OutputStream流
流程实例:代表流程定义的执行实例
业务表和Activiti引擎表关联(BusinessKey)
启动流程实例,添加businessKey:
//1、得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、得到RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//3、启动流程实例,同时还要指定业务标识businessKey,也就是出差申请单id,这里是1001
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myEvection","1001");
act_ru_execution中存储业务标识
挂起、激活流程实例
全部流程实例挂起:(流程定义id-》repositoryService)
//获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//查询流程定义的对象
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().
processDefinitionKey("myEvection").
singleResult();
//得到当前流程定义的实例是否都为暂停状态
boolean suspended = processDefinition.isSuspended();
//流程定义id
String processDefinitionId = processDefinition.getId();
//判断是否为暂停
if(suspended){
//如果是暂停,可以执行激活操作 ,参数1 :流程定义id ,参数2:是否激活,参数3:激活时间
repositoryService.activateProcessDefinitionById(processDefinitionId,true,null);
System.out.println("流程定义:"+processDefinitionId+",已激活");
}else{
//如果是激活状态,可以暂停,参数1 :流程定义id ,参数2:是否暂停,参数3:暂停时间
repositoryService.suspendProcessDefinitionById(processDefinitionId,true,null);
System.out.println("流程定义:"+processDefinitionId+",已挂起");
}
单个流程实例挂起:(流程实例对象id-》RuntimeService)
//获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//查询流程定义的对象
ProcessInstance processInstance = runtimeService.
createProcessInstanceQuery().
processInstanceId("15001").
singleResult();
//得到当前流程定义的实例是否都为暂停状态
boolean suspended = processInstance.isSuspended();
//流程实例id
String processDefinitionId = processInstance.getId();
//判断是否为暂停
if(suspended){
//如果是暂停,可以执行激活操作 ,参数:流程定义id
runtimeService.activateProcessInstanceById(processDefinitionId);
System.out.println("流程实例id:"+processDefinitionId+",已激活");
}else{
//如果是激活状态,可以暂停,参数:流程定义id
runtimeService.suspendProcessInstanceById( processDefinitionId);
System.out.println("流程实例id:"+processDefinitionId+",已挂起");
}
分配任务负责人
UEL表达式 ${变量名}
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取 RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//设置assignee的取值,用户可以在界面上设置流程的执行
Map<String,Object> assigneeMap = new HashMap<>();
assigneeMap.put("assignee0","张三");
assigneeMap.put("assignee1","李经理");
assigneeMap.put("assignee2","王总经理");
assigneeMap.put("assignee3","赵财务");
//启动流程实例,同时还要设置流程定义的assignee的值
runtimeService.startProcessInstanceByKey("myEvection1",assigneeMap);
监听器分配:
1.流程设计的时候指定监听器,设置Event,type,class
2.定义对应的监听器,设置处理逻辑。
流程变量:分支的判断变量
作用域: globa变量:流程变量的默认作用域是流程实例 taskService.setVariable(taskId, “evection”, evection); local变量:针对一个任务和一个执行实例范围 taskService.setVariablesLocal(taskId, variables);
组任务:任务设置多个候选人,可以从候选人中选择参与者来完成任务。一个人完成即可。
在流程图中任务节点的配置中设置 candidate-users(候选人),多个候选人之间用逗号分开。
a、查询组任务
//查询组任务
List list = taskService.createTaskQuery()
.processDefinitionKey(processDefinitionKey)
.taskCandidateUser(candidateUser)//根据候选人查询
.list();
b、拾取(claim)任务
//拾取任务
taskService.claim(taskId, userId);
c、查询个人任务
List list = taskService.createTaskQuery()
.processDefinitionKey(processDefinitionKey)
.taskAssignee(assignee)
.list();
d、办理个人任务
processEngine.getTaskService()
.complete(taskId);
e、归还组任务
// 如果设置为null,归还组任务,该 任务没有负责人
taskService.setAssignee(taskId, null);
排他网关ExclusiveGateway:
只有一条路径会被选择。流程执行到该网关时,按照输出流的顺序逐个计算,当条件的计算结果为true时,继续执行当前网关的输出流;
如果多条线路计算结果都是 true,则会执行第一个值为 true 的线路。如果所有网关计算结果没有true,则引擎会抛出异常。
排他网关需要和条件顺序流结合使用,default 属性指定默认顺序流,当所有的条件不满足时会执行默认顺序流。
并行网关ParallelGateway
所有路径会被同时选择
拆分 —— 并行执行所有输出顺序流,为每一条顺序流创建一个并行执行线路。
合并 —— 所有从并行网关拆分并执行完成的线路均在此等候,直到所有的线路都执行完成才继续向下执行。
包含网关InclusiveGateway
可以同时执行多条线路,也可以在网关上设置条件
拆分 —— 计算每条线路上的表达式,当表达式计算结果为true时,创建一个并行线路并继续执行
合并 —— 所有从并行网关拆分并执行完成的线路均在此等候,直到所有的线路都执行完成才继续向下执行。
事件网关EventGateway
专门为中间捕获事件设置的,允许设置多个输出流指向多个不同的中间捕获事件。当流程执行到事件网关后,流程处于等待状态,需要等待抛出事件才能将等待状态转换为活动状态。