【Flowable】任务监听器(五)

news2024/12/28 5:52:55

前言

之前有需要使用到Flowable,鉴于网上的资料不是很多也不是很全也是捣鼓了半天,因此争取能在这里简单分享一下经验,帮助有需要的朋友,也非常欢迎大家指出不足的地方。

一、监听器

在Flowable中,我们可以使用监听器来完成很多流程业务,比如指定任务处理人、任务通知提醒等操作,在这里我们来简单尝试一下监听器的使用,我们在上篇文章中使用的请假流程中来创建监听器。

在这里插入图片描述
在这里插入图片描述
如上图所示:

  • 事件
    • create:任务创建的时候触发。
    • assignment:在分配处理人的时候触发。
    • complete:处理完成之后触发。
    • all:所有的行为都会触发

我们创建一下监听器:指定一下事件类型这里用create,其中org.flowable.TestTaskListener为自定义的一个java类
在这里插入图片描述
这里也提供了更新之后的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef" exporter="Flowable Open Source Modeler" exporterVersion="6.7.2">
    <process id="MyHoliday" name="MyHoliday" isExecutable="true">
        <startEvent id="startEvent1" name="开始" flowable:formFieldValidation="true"></startEvent>
        <userTask id="sid-320C4AED-D9F4-4C53-B2B6-D4ACCBA155F5" name="直线审批" flowable:formFieldValidation="true">
            <extensionElements>
                <flowable:taskListener event="create" class="org.flowable.TestTaskListener"></flowable:taskListener>
            </extensionElements>
        </userTask>
        <sequenceFlow id="sid-422764E6-61F4-454A-BF08-9CF973E1E67D" sourceRef="startEvent1" targetRef="sid-320C4AED-D9F4-4C53-B2B6-D4ACCBA155F5"></sequenceFlow>
        <userTask id="sid-873E297E-9E6B-4F4E-AF6A-2E085F1806B1" name="部门审批" flowable:formFieldValidation="true">
            <extensionElements>
                <flowable:taskListener event="create" class="org.flowable.TestTaskListener"></flowable:taskListener>
            </extensionElements>
        </userTask>
        <sequenceFlow id="sid-A0869337-10D3-43BC-90C1-036C9719308E" sourceRef="sid-320C4AED-D9F4-4C53-B2B6-D4ACCBA155F5" targetRef="sid-873E297E-9E6B-4F4E-AF6A-2E085F1806B1"></sequenceFlow>
        <endEvent id="sid-CAB64925-F653-4167-8E12-ED956B723D2E" name="结束"></endEvent>
        <sequenceFlow id="sid-91D96B3A-3408-4504-A23D-8F0C2AFE19A7" sourceRef="sid-873E297E-9E6B-4F4E-AF6A-2E085F1806B1" targetRef="sid-CAB64925-F653-4167-8E12-ED956B723D2E"></sequenceFlow>
    </process>
    <bpmndi:BPMNDiagram id="BPMNDiagram_MyHoliday">
        <bpmndi:BPMNPlane bpmnElement="MyHoliday" id="BPMNPlane_MyHoliday">
            <bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
                <omgdc:Bounds height="30.0" width="30.0" x="89.99999731779107" y="149.99999552965178"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="sid-320C4AED-D9F4-4C53-B2B6-D4ACCBA155F5" id="BPMNShape_sid-320C4AED-D9F4-4C53-B2B6-D4ACCBA155F5">
                <omgdc:Bounds height="80.0" width="100.00000000000003" x="164.99999731779107" y="124.99999552965178"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="sid-873E297E-9E6B-4F4E-AF6A-2E085F1806B1" id="BPMNShape_sid-873E297E-9E6B-4F4E-AF6A-2E085F1806B1">
                <omgdc:Bounds height="80.00000000000001" width="100.0" x="299.99999105930357" y="119.99999642372141"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="sid-CAB64925-F653-4167-8E12-ED956B723D2E" id="BPMNShape_sid-CAB64925-F653-4167-8E12-ED956B723D2E">
                <omgdc:Bounds height="28.0" width="28.0" x="464.9999861419205" y="145.9999920725826"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNEdge bpmnElement="sid-91D96B3A-3408-4504-A23D-8F0C2AFE19A7" id="BPMNEdge_sid-91D96B3A-3408-4504-A23D-8F0C2AFE19A7" flowable:sourceDockerX="50.0" flowable:sourceDockerY="40.00000000000001" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0">
                <omgdi:waypoint x="399.94999034668683" y="159.99999473723344"></omgdi:waypoint>
                <omgdi:waypoint x="464.99998600932435" y="159.99999254311274"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="sid-A0869337-10D3-43BC-90C1-036C9719308E" id="BPMNEdge_sid-A0869337-10D3-43BC-90C1-036C9719308E" flowable:sourceDockerX="50.000000000000014" flowable:sourceDockerY="40.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.00000000000001">
                <omgdi:waypoint x="264.9499973177909" y="163.1481439230865"></omgdi:waypoint>
                <omgdi:waypoint x="299.9999910593035" y="161.8499961786801"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="sid-422764E6-61F4-454A-BF08-9CF973E1E67D" id="BPMNEdge_sid-422764E6-61F4-454A-BF08-9CF973E1E67D" flowable:sourceDockerX="15.0" flowable:sourceDockerY="15.0" flowable:targetDockerX="50.000000000000014" flowable:targetDockerY="40.0">
                <omgdi:waypoint x="119.94999580774865" y="164.99999552965178"></omgdi:waypoint>
                <omgdi:waypoint x="164.9999973177828" y="164.99999552965178"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
        </bpmndi:BPMNPlane>
    </bpmndi:BPMNDiagram>
</definitions>

将此xml文件放置项目的资源目录下

二、创建监听类

package org.flowable;

import org.flowable.engine.delegate.TaskListener;
import org.flowable.task.service.delegate.DelegateTask;

/**
 * Author:hyy
 * Date:2023/9/15
 * Description:
 */
public class TestTaskListener implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
        System.err.println("============= 监听器执行 ================= ");

        if("create".equals(delegateTask.getEventName()) ){
            System.out.println("你的业务操作....");
        }
    }
}

创建TestTaskListener实现TaskListener,我们发现这个方法的关键信息都是从DelegateTask中获取,name我们来看一下这个类

public interface DelegateTask extends VariableScope {

    //任务ID
    String getId();

  	//任务名称
    String getName();

   	
    void setName(String name);

  	//描述
    String getDescription();


    void setDescription(String description);

   	//优先级
    int getPriority();

    
    void setPriority(int priority);

    //实例ID
    String getProcessInstanceId();


    //流程定义ID
    String getProcessDefinitionId();

    
    Date getCreateTime();

	//任务主键
    String getTaskDefinitionKey();
	
  	//是否终断
    boolean isSuspended();

    //租户ID
    String getTenantId();

	//表单key
    String getFormKey();

   
    void setFormKey(String formKey);

   	//事件
    String getEventName();
	//....... 
}

三、重新部署流程

在上一篇文章示例中,我们在重新部署一下这个流程

   @Test
    public void testDeploy() {
        //1.获取ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.获取RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //3.完成流程部署操作
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("MyHoliday.bpmn20.xml") //关联要部署的流程名称
                .name("请假流程")
                .deploy(); //部署流程


        System.out.println("id: " + deploy.getId()); 
        System.out.println("name: " + deploy.getName());
        System.out.println("key: " + deploy.getKey());

    }

这里去ACT_RE_PROCDEF中找到部署ID为代码打印的ID数据我这里是35001,拿到他的ID_字段MyHoliday:2:35004去启动流程
在这里插入图片描述

四、启动流程

@Test
    public void startTest() {
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();

        RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();


        Map<String, Object> variables = new HashMap<>();


        variables.put("firstAssigne", "张三");
        variables.put("deptAssigne", "李四");

        ProcessInstance processInstance = runtimeService.startProcessInstanceById("MyHoliday:2:35004", variables);


        System.out.println("processInstance.getProcessInstanceId() = " + processInstance.getProcessInstanceId());
    }

发现控制台打印如下日志,表示监听器执行完成
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1012351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎样下载和安装HBuilder软件?【附HBuilder快捷键】

HBuilder是一款深度集成Eelipse的IDE编辑器&#xff0c;但其主要集中在Web前端的开发&#xff0c;不能进行Java等后台开发。HBuilder提供了对JavaScrijpt、jQuery、HTML5、MUI等语法的提示功能&#xff0c;同时包含很多快捷键&#xff0c;让前端开发更加便捷。 访问HBuilder官…

全量数据采集:不同网站的方法与挑战

简介 在当今数字化时代中&#xff0c;有数据就能方便我们做出很多决策。数据的获取与分析已经成为学术研究、商业分析、战略决策以及个人好奇心的关键驱动力。本文将分享不同网站的全量数据采集方法&#xff0c;以及在这一过程中可能会遇到的挑战。 部分全量采集方法 1. 撞店…

1500*B. The Walkway(贪心规律)

解析&#xff1a; 把每个区间段分成左闭右开区间&#xff0c;我们可以观察到&#xff0c;每个区间的饼干数量为 ( r - l ) / d 上取整。 所以先计算不删除某个点的饼干总和init&#xff0c;然后遍历所有点&#xff0c;将这个点删除。所以删除某个点后剩余数量为&#xff1a; 找…

WOODWARD 5466-258 输入快速实施高效的闭环控制

WOODWARD 5466-258 输入快速实施高效的闭环控制 Malvern Instruments 增强了 Link II 软件包&#xff0c;可将多个分析仪集成到一个自动化控制平台中。最新的开发将 Malvern Link II 的优势扩展到该公司的 Mastersizer 和 Zetasizer 分析仪系列&#xff0c;简化了它们在过…

二蛋赠书二期:《Python机器学习项目实战》

文章目录 前言活动规则参与方式本期赠书《Python机器学习项目实战》作者介绍内容简介读者对象获奖名单 结语 前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&am…

EMQX Enterprise 5.2 发布:Flow 设计器,Amazon Kinesis,Azure Event Hubs

EMQX Enterprise 5.2.0 版本现已正式发布&#xff01; 新版本带来了一系列重磅更新&#xff0c;最令人瞩目的是可拖拽的可视化 Flow 设计器&#xff0c;它可以帮助企业快速创建、测试和部署数据集成。同时&#xff0c;我们新增了对 Amazon Kinesis 和 Azure Event Hubs 的支持…

Python pip更换清华源镜像

Python pip更换清华源镜像 命令安装配置安装其它镜像 在安装Python库时使用清华源镜像是为了改善库的下载速度和稳定性地址&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 命令安装 安装命令&#xff1a; pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simp…

Ubuntu使用System.Drawing.dll报错DllNotFoundException: libgdiplus.so.0

在Windows上开发的程序使用了System.Drawing.dll&#xff0c;放到Ubuntu上报错 解决方法&#xff1a;在Ubuntu上安装libgdiplus即可。 命令&#xff1a;sudo apt install libgdiplus 成功&#xff01;

huggingface.co 下载模型文件,死活找不到文件,也没报其他错误。原来是多了个%号

这样写&#xff0c;就没问题&#xff1a; snapshot_download(local_dir/content/drive/MyDrive/chatRWKV/models/,repo_id"BlinkDL/rwkv-4-raven", allow_patterns"RWKV-4-Raven-3B-v12-Eng49%-Chn49%-Jpn1%-Other1%-20230527-ctx4096.pth") 但是这个文件…

高电压+大电流 IGBT静态参数测试解决方案

近年来IGBT成为电力电子领域中尤为瞩目的电力电子器件,并得到越来越广泛的应用,那么IGBT的测试就变的尤为重要了。lGBT的测试包括静态参数测试、动态参数测试、功率循环、HTRB可靠性测试等,这些测试中最基本的测试就是静态参数测试。 IGBT静态参数主要包含:栅极-发射极阈值电压…

S7-1200PLC硬件中断编程应用(VN积分法计算实时卷径)

VN积分法计算实时卷径的算法原理请参考下面文章链接: VN积分法卷径计算FB(SCL代码)_RXXW_Dor的博客-CSDN博客卷径计算的其他方法请参看专栏的相关文章,链接如下:卷径计算(V/N法)_RXXW_Dor的博客-CSDN博客。https://rxxw-control.blog.csdn.net/article/details/131612206PL…

前端JavaScript深拷贝与浅拷贝

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 引言 1. 深拷贝的实现 1.1 基本类型和特殊类型的处理 1.2 处理循环引用 1.3 性能优化 1.4 完整的深拷贝实现示…

MES系统成为工业4.0首选,制造业真正数字化车间你看过吗?

在日益激烈的市场竞争中&#xff0c;MES管理系统已经成为企业提升生产效率、降低成本、提高竞争力的关键。通过MES管理系统实现数据集成和分析&#xff0c;能够对产品制造过程的各个环节进行可视化控制&#xff0c;从设计、制造、质量、物流等环节全面掌控信息&#xff0c;实现…

螺旋折线(找规律 + 准确取点优化分析 + 普通思路)【包含详细的思考过程】

螺旋折线 文章目录 螺旋折线前言题目描述题目分析优化思路知识点补充【曼哈顿距离】代码未优化思路【笨方法】 前言 在写完题目查看题解的时候&#xff0c;被acwing大佬的思路所震撼&#xff0c;所以按照自己的理解将 大佬的思路复刻一遍展现给大家&#xff0c;同时丰富了内容…

彩虹医疗器械彩超、内窥镜维修技能学习

近几年随着医疗行业的快速发展&#xff0c;医疗器械的需求量不断增加&#xff0c;同时对医疗器械的维修和保养需求也在不断增长随着医疗技术的不断进步&#xff0c;新型、复杂的医疗器械不断涌现&#xff0c;这对维修技术提出了更高的要求。加强技术研发是必经之路&#xff0c;…

Element Plus中Cascader 级联选择器(选择任意一级选项 - 更改下拉框选中方式)

组件原始选中&#xff1a;选择文字前面的单选按钮 现在更改为&#xff1a;隐藏单选按钮&#xff0c;点击文字进行选中 ① 给弹出内容的自定义类名(popper-class)&#xff1a; <el-cascader v-model"areaValue":options"areaOptions" :props"areaP…

算法刷题 week2

目录 week21. 二维数组中的查找题目题解(单调性扫描) O(nm) 2.替换空格题目题解(线性扫描) O(n)(双指针扫描) O(n) 3.从尾到头打印链表题目题解(遍历链表) O(n) week2 1. 二维数组中的查找 题目 题解 (单调性扫描) O(nm) 核心在于发现每个子矩阵右上角的数的性质&#xff1…

MySQL数据库技术笔记(1)

MySQL是一种关系数据库管理系统. 按照数据结构来组织、存储和管理数据的仓库. 数据库的发展&#xff1a; 1.层次模型存储&#xff1a;归为大类&#xff0c;分小类&#xff0c;也称树形结构 2.网状模型 3.关系模型&#xff1a;1对1的关系&#xff0c;1对多的关系&#xff0…

04目标检测-Two-stage的目标检测算法

目录 一、 深度学习目标检测算法介绍 二、 基于Two-stage的目标检测算法 三、Two-stage基本流程 四、Two-stage常见算法 五、Two-stage核心组件 1、Two-stage的两个核心组件 2、主干CNN网络设计原则 3、RPN网络 3.1 Faster R-CNN 网络结构 3.2 RPN&#xff08;Region…

安装rsa依赖库出现ERROR: No matching distribution found for rsa

通过安装离线包的方式安装python-rsa依赖包&#xff0c;出现错误 执行命令&#xff08;require 文件夹中是rsa-4.9.tar.gz文件&#xff0c;加粗&#xff0c;后面会用到&#xff09;pip install --no-index --find-link./require -r ./requirements.txt&#xff0c;出现以下错误…