SpringBoot + Activiti 监控流程结束、获取最后一个审批Task信息

事件监听类

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&amp;serverTimezone=Asia/Shanghai&amp;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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于Spring BootActiviti,我们可以实现一个简单的流程审批系统。首先,需要搭建一个Spring Boot项目,并添加Activiti的相关依赖。然后,我们可以使用Activiti提供的API来定义流程、发起审批和处理审批。 在项目中,我们可以通过编写BPMN 2.0的定义文件来定义流程。在该文件中,我们可以添加活动(任务),并定义活动之间的流程流转条件。然后,使用Activiti的API部署该流程定义到Activiti引擎中。 在发起审批时,可以通过调用Activiti的API来启动一个流程实例。在启动流程实例时,可以设置相关的参数,如申请人、审批金额等。Activiti会根据流程定义自动创建相应的流程实例和任务。 在处理审批时,可以根据当前用户查询待办任务列表,并选择某个任务进行处理。处理任务可以包括审批通过、驳回、转交等操作。在处理任务时,可以通过Activiti的API设置相关的参数,并将任务流转到下一步或退回上一步。 此外,我们还可以添加监听器来监听流程的各个状态,如流程启动、任务分配、任务完成等。通过监听器,我们可以在流程流转时执行一些自定义的逻辑,如发送邮件通知、记录审批历史等。 综上所述,基于Spring BootActiviti,我们可以实现一个简单的流程审批系统。通过配置流程定义、发起审批和处理审批,我们可以实现审批流程的自动化和可视化。同时,通过添加监听器和自定义逻辑,我们可以满足不同业务场景下的特定需求。 ### 回答2: 利用Spring BootActiviti可以很方便地实现流程审批功能。下面我将详细介绍如何使用Spring BootActiviti来实现流程审批。 首先,需要在Spring Boot项目的pom.xml文件中添加Activiti的依赖。可以在Maven仓库中找到最新的Activiti版本,并将其添加到pom.xml文件中。 接下来,需要创建Activiti的配置类,以便在Spring Boot中集成Activiti。这个配置类应该继承自Activiti的ProcessEngineConfigurationConfigurer接口,并实现其configure方法。在configure方法中,我们可以进行一些Activiti的配置,比如设置数据库相关的配置、添加流程监听器等。 然后,需要创建流程定义文件。可以使用Activiti提供的图形化工具来创建流程定义文件,也可以通过编码的方式来创建。在流程定义文件中,需要定义流程的各个节点,以及节点之间的连线和流程变量。 接下来,需要编写与流程审批相关的业务逻辑代码。这些代码应该包括启动流程实例、查询待办任务、完成任务等功能。可以使用Activiti提供的API来完成这些操作。 最后,需要创建前端页面用于展示和处理审批任务。可以使用Thymeleaf等模板引擎来创建页面,并通过Ajax请求与后端进行数据交互。 综上所述,借助于Spring BootActiviti,我们可以快速便捷地实现流程审批功能。这种方式不仅可以提高开发效率,还有利于代码的维护和扩展。希望以上内容对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值