事件监听类
package com.java.core.web.aop;
import lombok.SneakyThrows;
import org.activiti.engine.FormService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.delegate.event.ActivitiEvent;
import org.activiti.engine.delegate.event.ActivitiEventListener;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.activiti.engine.form.FormProperty;
import org.activiti.engine.history.HistoricTaskInstance;
import java.util.List;
public class ActivitiEventAspect implements ActivitiEventListener {
// private ProcessEngine processEngine = null; //获取不到
//
// public ActivitiEventAspect(ProcessEngine processEngine) {
// this.processEngine = processEngine;
// }
@SneakyThrows
@Override
public void onEvent(ActivitiEvent event) {
ActivitiEventType eventType = event.getType();
if (event.getType() == ActivitiEventType.PROCESS_COMPLETED) {
System.out.println("流程结束start================================== ");
//读取配置文件
ProcessEngineConfiguration processEngineConfiguration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.xml", "processEngineConfiguration");
//创建ProcessEngine
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
String processInstanceId = event.getProcessInstanceId();
// 打印流程实例 ID
System.out.println("Process Instance ID: " + processInstanceId);
//Thread.sleep(5000); // 主线程睡眠5秒钟
// 表单属性值
FormService formService = processEngine.getFormService();
List<HistoricTaskInstance> historicTaskInstances = processEngine.getHistoryService().createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId)
//.finished()
.orderByTaskId()
.desc()
//.list();
.listPage(0, 1);
for (HistoricTaskInstance hisTask : historicTaskInstances) {
System.out.println("Task ID: " + hisTask.getId());
System.out.println("Task Name: " + hisTask.getName());
System.out.println("Task Assignee: " + hisTask.getAssignee());
System.out.println("Task End Time: " + hisTask.getEndTime());
//获取表单属性值
List<FormProperty> taskFormData = formService.getTaskFormData(hisTask.getId()).getFormProperties();
for (FormProperty formProperty : taskFormData) {
System.out.println("表单id = " + formProperty.getId());
System.out.println("表单name = " + formProperty.getName());
System.out.println("表单value = " + formProperty.getValue());
System.out.println("表单type = " + formProperty.getType());
}
}
System.out.println("流程结束end================================== ");
}
}
@Override
public boolean isFailOnException() {
return false;
}
}
activiti.xml添加监听配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 这里可以使用 链接池 dbcp-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/javacore?useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true"/>
<property name="username" value="root"/>
<property name="password" value="asdf-1234"/>
<property name="maxActive" value="3"/>
<property name="maxIdle" value="1"/>
</bean>
<!-- 配置ProcessEngine -->
<!-- <bean id="processEngine" class="org.activiti.engine.ProcessEngines" factory-method="getDefaultProcessEngine" />-->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="dataSource" ref="dataSource"/>
<property name="databaseSchemaUpdate" value="true"/>
<!-- 添加Execution监听器 -->
<property name="eventListeners">
<list>
<bean class="com.java.core.web.aop.ActivitiEventAspect"/>
<!-- <bean id="activitiEventAspect" class="com.java.core.web.aop.ActivitiEventAspect">-->
<!-- <constructor-arg ref="processEngine" />-->
<!-- </bean>-->
</list>
</property>
</bean>
</beans>
测试类模拟流程审批结束
/**
* 流程监控测试
*/
@Test
public void listenerTest() throws InterruptedException {
// 1. 创建ProcessEngine
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
// 2. 获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String, Object> variables = new HashMap<>();
variables.put("sourceId", "测试李四的值");
System.out.println("发起流程信息========================================================");
// 3. 根据流程定义的id启动流程
ProcessInstance myEvection = runtimeService.startProcessInstanceByKey("demo-process", variables);
System.out.println("流程定义id = " + myEvection.getProcessDefinitionId());
System.out.println("流程实例id = " + myEvection.getId());
System.out.println("当前活动id = " + myEvection.getActivityId());
// 2.获取taskService
TaskService taskService = processEngine.getTaskService();
// 表单属性值
FormService formService = processEngine.getFormService();
Task task = taskService.createTaskQuery() //完成李四任务
.processDefinitionKey("demo-process")
.taskAssignee("李四")
.singleResult();
System.out.println("李四节点的信息========================================================");
//获取表单属性值
List<FormProperty> taskFormData = formService.getTaskFormData(task.getId()).getFormProperties();
for (FormProperty formProperty : taskFormData) {
System.out.println("表单id = " + formProperty.getId());
System.out.println("表单name = " + formProperty.getName());
System.out.println("表单value = " + formProperty.getValue());
System.out.println("表单type = " + formProperty.getType());
}
//设置表单属性值
variables = new HashMap<>();
variables.put("sourceId", "给张三了");
System.out.println("流程图的名称 = " + task.getName());
System.out.println("流程图的id = " + task.getTaskDefinitionKey());
System.out.println("流程实例id = " + task.getProcessInstanceId());
System.out.println("当前任务id = " + task.getId());
System.out.println("当前任务负责人id = " + task.getAssignee());
taskService.complete(task.getId(), variables);
Thread.sleep(5000); // 主线程睡眠5秒钟
System.out.println("张三节点的信息========================================================");
task = taskService.createTaskQuery() //完成张三任务
.processDefinitionKey("demo-process")
.taskAssignee("张三")
.singleResult();
//获取表单属性值
taskFormData = formService.getTaskFormData(task.getId()).getFormProperties();
for (FormProperty formProperty : taskFormData) {
System.out.println("表单id = " + formProperty.getId());
System.out.println("表单name = " + formProperty.getName());
System.out.println("表单value = " + formProperty.getValue());
System.out.println("表单type = " + formProperty.getType());
}
System.out.println("流程图的名称 = " + task.getName());
System.out.println("流程图的id = " + task.getTaskDefinitionKey());
System.out.println("流程实例id = " + task.getProcessInstanceId());
System.out.println("当前任务id = " + task.getId());
System.out.println("当前任务负责人id = " + task.getAssignee());
System.out.println("所有流程跑完======================================================== ");
taskService.complete(task.getId());
}
日志
发起流程信息========================================================
2024-03-22 13:24:23.731 [main] INFO o.activiti.engine.impl.bpmn.deployer.BpmnDeployer - Processing resource bpmn/demo.png
2024-03-22 13:24:23.731 [main] INFO o.activiti.engine.impl.bpmn.deployer.BpmnDeployer - Processing resource bpmn/demo.bpmn20.xml
流程定义id = demo-process:2:10004
流程实例id = 82501
当前活动id = submit-event
李四节点的信息========================================================
表单id = form1
表单name = null
表单value = 测试李四的值
表单type = null
流程图的名称 = 发起人
流程图的id = submit-event
流程实例id = 82501
当前任务id = 82505
当前任务负责人id = 李四
张三节点的信息========================================================
表单id = form2
表单name = null
表单value = 给张三了
表单type = null
流程图的名称 = 审批人
流程图的id = task-event
流程实例id = 82501
当前任务id = 82508
当前任务负责人id = 张三
所有流程跑完========================================================
流程结束start==================================
2024-03-22 13:24:29.609 [main] INFO org.activiti.engine.impl.ProcessEngineImpl - ProcessEngine default created
Process Instance ID: 82501
Task ID: 82508
Task Name: 审批人
Task Assignee: 张三
Task End Time: Fri Mar 22 13:24:29 CST 2024
表单id = form2
表单name = null
表单value = 给张三了
表单type = null
流程结束end==================================
Disconnected from the target VM, address: '127.0.0.1:63330', transport: 'socket'
Process finished with exit code 0