Activiti 项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),提供技术实现。
对于开发者来说,Activiti 就是一套 BPMN2.0 标准的流程引擎,通过 Activiti 实现流程的驱动及各类操作。
这里对(简单场景)常用的方法进行了简单的封装与测试。
/** * @Description 部署流程 * name:流程名称 * category:流程类别 * fileName:流程文件名称 */ @Override public String deploy(String name, String category, String fileName) { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service .createDeployment()//创建一个部署对象 .name(name)//添加部署名称 .category(category) .addClasspathResource("processes/" + fileName)//从classpath的资源中加载,一次只能加载一个文件 .deploy();//完成部署 System.out.println("<------ 流程部署成功 ------>"); System.out.println("部署ID:" + deployment.getId()); System.out.println("部署名称:" + deployment.getName()); return deployment.getId(); } /** * @Description 启动一个流程且设置实例全局变量,并返回启动的流程实例的 ID * processDefineId 流程定义 ID * processName 流程实例命名 * globalParamsMap 流程实例的全局变量 */ @Override public String startProcess(String processDefineId, String processName, Map globalParamsMap) { if (null == processDefineId || processDefineId.length() == 0) throw new NullPointerException("processInstanceId is null!"); if (null == processName || processName.length() == 0) throw new NullPointerException("processName is null!"); ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); ProcessInstance instance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefineId, globalParamsMap); //为流程定义设置名称 processEngine.getRuntimeService().setProcessInstanceName(instance.getId(), processName); return instance.getId(); } /** * @Description 根据流程实例 ID 获取当前环节 */ @Override public List<Task> getCurrentNode(String processInstanceId) { if (null == processInstanceId || processInstanceId.length() == 0) throw new NullPointerException("processInstanceId is null!"); if (this.isProcessFinish(processInstanceId)) throw new RuntimeException("instance : " + processInstanceId + " is over!"); ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); List<Task> task = processEngine.getTaskService().createTaskQuery().processInstanceId(processInstanceId).active().list(); return task; } /** * @Description 完成任务并设置实例全局变量 * processInstanceId:流程实例中当前办理节点的 ID * globalParamsMap:流程实例的全局变量 */ @Override public void completeNode(String taskId, Map globalParamsMap) { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = processEngine.getTaskService(); taskService.complete(taskId, globalParamsMap); } /** * @Description 查看流程是否已结束 * processInstanceId 流程实例 ID */ @Override public boolean isProcessFinish(String processInstanceId) { if (null == processInstanceId || processInstanceId.length() == 0) throw new NullPointerException("processInstanceId is null!"); ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); HistoricProcessInstance historicProcessInstance = processEngine.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); if (Objects.isNull(historicProcessInstance)) throw new NullPointerException("processInstance is not exsits"); if (Objects.isNull(historicProcessInstance.getEndTime())) return false; else return true; } /** * @Description 为实例设置流程变量 */ @Override public void setInstanceParams(String processInstanceId, Map map) { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService(); runtimeService.setVariables(processInstanceId, map); } /** * @Description 获取实例中的流程变量 */ @Override public Map<String, Object> getInstanceParams(String processInstanceId) { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService(); Map<String, Object> variables = runtimeService.getVariables(processInstanceId); System.out.println(" <------ 实例中的变量 ------> "); variables.forEach((k, v) -> { System.out.println(k + " " + v); }); return variables; } /** * @Description 设置环节节点的 local 变量 */ @Override public void setTaskLocalParams(String taskId, String k, String v) { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = processEngine.getTaskService(); Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); taskService.setVariableLocal(task.getId(), k, v); System.out.println("设置 local 变量成功 : " + k + " : " + v); } /** * @Description 获取环节节点的 local 变量 */ @Override public String getTaskLocalParams(String taskId, String k) { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = processEngine.getTaskService(); Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); String v = taskService.getVariableLocal(task.getId(), k).toString(); return v; }
简单实现一个监听器
/** * 任务监听器用于在特定的任务相关事件发生时,执行自定义的Java逻辑或表达式 * 任务监听器支持下列属性: * event(事件)(必填):任务监听器将被调用的任务事件类型。可用的事件有: * create(创建):当任务已经创建,并且所有任务参数都已经设置时触发。 * assignment(指派):当任务已经指派给某人时触发。请注意:当流程执行到达用户任务时,create事件触发前,首先触发assignment事件。这看起来不是自然顺序,但是有实际原因的:当收到create * 事件时,我们通常希望查看任务的所有参数,包括办理人。 * complete(完成):当任务已经完成,从运行时数据中删除前触发。 * delete(删除):在任务即将被删除前触发。请注意当任务通过completeTask正常完成时也会触发 * class:需要调用的代理类。这个类必须实现 org.activiti.engine.delegate.TaskListener 接口 * expression:(不能与class属性一起使用):指定在事件发生时要执行的表达式。可以为被调用的对象传递 DelegateTask 对象与事件名(使用 task.eventName )作为参数 * delegateExpression:可以指定一个能够解析为 TaskListener 接口实现类对象的表达式。与服务任务类似 */ @Slf4j public class TemplateListener implements TaskListener { private static final long serialVersionUID = 3654543511891213996L; @Override public void notify(DelegateTask delegateTask) { // 事件名称 String eventName = delegateTask.getEventName(); if (EVENTNAME_CREATE.endsWith(eventName)) { System.out.println(" >>>>>> create <<<<<< "); } else if (EVENTNAME_ASSIGNMENT.endsWith(eventName)) { System.out.println(" >>>>>> assignment <<<<<< "); } else if (EVENTNAME_COMPLETE.endsWith(eventName)) { System.out.println(" >>>>>> complete <<<<<< "); } else if (EVENTNAME_DELETE.endsWith(eventName)) { System.out.println(" >>>>>> delete <<<<<< "); } System.out.println("creatTime: " + DateUtils.dateToStr(delegateTask.getCreateTime())); // 获取流程定义id System.out.println("processDefinitionId: " + delegateTask.getProcessDefinitionId()); // 实例 ID System.out.println("processInstanceId: " + delegateTask.getProcessInstanceId()); // 执行路径 ID,execution 和 分支是一对一的关系,有多少个分支就有多少个execution,介于 processInstance 与 task 之间 // 是 processInstance 的分支、是 task 的执行环境 // execution 与 processInstance:启动流程,会创建流程实例,此是会在act_ru_execution中保存数据(主流程数据、子流程数据), // 如果只有一个流程分支的话,还会在此表中创建一条子流程数据,会引用主流程数据的id(processInstanceId), // 如果有多个分支就会创建多个子流程数据 // execution 与 task:从级别上来说,execution相当于task的执行环境,execution是包含task的 System.out.println("executionId: " + delegateTask.getExecutionId()); // 任务 ID System.out.println("taskId: " + delegateTask.getId()); // 任务名称 System.out.println("taskName: " + delegateTask.getName()); // 描述信息 System.out.println("description: " + delegateTask.getDescription()); // 优先级 System.out.println("Priority 0-100: " + delegateTask.getPriority()); } }
画个流程测试下,流程图如下:
单一网关的判断条件:
条件分支的判断条件:
对其中的环节 3 配置了上面的示例监听器
测试方法,部署流程
//部署流程 @Test public void testDeploy() { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service .createDeployment()//创建一个部署对象 .name("请假流程")//添加部署名称 .category("测试流程类别") .addClasspathResource("processes/MyProcess.bpmn20.xml")//从classpath的资源中加载,一次只能加载一个文件 .deploy();//完成部署 System.out.println("部署ID:" + deployment.getId()); System.out.println("部署名称:" + deployment.getName()); }
测试方法,启动流程并不断执行任务,知道流程办结
@Test public void tst() { String processDefineId = "Process_1qa45id"; Map params = new HashMap(); params.put("type", "1"); params.put("level5", "1"); String instanceId = activitiService.startProcess(processDefineId, "测试流程实例1", params); System.out.println("流程启动成功,实例 ID:" + instanceId); activitiService.getInstanceParams(instanceId); while (!activitiService.isProcessFinish(instanceId)) { dealOneLevel(instanceId); } System.out.println(activitiService.isProcessFinish(instanceId) ? "已办结" : "未办结"); } public void dealOneLevel(String instanceId) { System.out.println(""); List<Task> taskList = activitiService.getCurrentNode(instanceId); for (int i = 0; i < taskList.size(); i++) { Task task = taskList.get(i); System.out.println(" <------ 环节办理 ------> "); System.out.println("当前环节ID:" + task.getId()); System.out.println("当前环节名称:" + task.getName()); System.out.println("流程开始时间:" + DateUtils.dateToStr(task.getCreateTime())); System.out.println("受理人/办理人:" + task.getAssignee()); System.out.println("委托人:" + task.getOwner()); activitiService.completeNode(task.getId(), new HashMap()); } }
流程的执行过程:
流程启动成功,实例 ID:800001 <------ 实例中的变量 ------> level5 1 type 1 <------ 环节办理 ------> 当前环节ID:800009 当前环节名称:环节1 流程开始时间:2022-10-26 16:49:38 受理人/办理人:环节1办理人 委托人:null <------ 环节办理 ------> 当前环节ID:800016 当前环节名称:环节2.1 流程开始时间:2022-10-26 16:49:38 受理人/办理人:环节2办理人1 委托人:null <------ 环节办理 ------> 当前环节ID:800019 当前环节名称:环节2.2 流程开始时间:2022-10-26 16:49:38 受理人/办理人:环节2办理人2 委托人:null <------ 环节办理 ------> 当前环节ID:800022 当前环节名称:环节2.3 流程开始时间:2022-10-26 16:49:38 受理人/办理人:环节2.3办理人 委托人:null <------ 环节办理 ------> 当前环节ID:800025 当前环节名称:环节2.4 流程开始时间:2022-10-26 16:49:38 受理人/办理人:环节2.4办理人 委托人:null <------ 环节办理 ------> 当前环节ID:800032 当前环节名称:环节3 流程开始时间:2022-10-26 16:49:38 受理人/办理人:环节3办理人 委托人:null >>>>>> complete <<<<<< creatTime: 2022-10-26 16:49:38 processDefinitionId: Process_1qa45id:11:797504 processInstanceId: 800001 executionId: 800014 taskId: 800032 taskName: 环节3 description: null Priority 0-100: 50 <------ 环节办理 ------> 当前环节ID:800036 当前环节名称:环节4.1 流程开始时间:2022-10-26 16:49:38 受理人/办理人:环节4.1办理人 委托人:null <------ 环节办理 ------> 当前环节ID:800039 当前环节名称:环节5 流程开始时间:2022-10-26 16:49:38 受理人/办理人:环节5办理人 委托人:null 已办结
标签:封装,String,activiti,流程,processInstanceId,环节,测试,println,processEngine From: https://www.cnblogs.com/niuyourou/p/16829347.html