【Flowable】任务监听器(五)

前言

之前有需要使用到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 {@Overridepublic void notify(DelegateTask delegateTask) {System.err.println("============= 监听器执行 ================= ");if("create".equals(delegateTask.getEventName()) ){System.out.println("你的业务操作....");}}
}

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

public interface DelegateTask extends VariableScope {//任务IDString getId();//任务名称String getName();void setName(String name);//描述String getDescription();void setDescription(String description);//优先级int getPriority();void setPriority(int priority);//实例IDString getProcessInstanceId();//流程定义IDString getProcessDefinitionId();Date getCreateTime();//任务主键String getTaskDefinitionKey();//是否终断boolean isSuspended();//租户IDString getTenantId();//表单keyString getFormKey();void setFormKey(String formKey);//事件String getEventName();//....... 
}

三、重新部署流程

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

   @Testpublic void testDeploy() {//1.获取ProcessEngine 对象ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//2.获取RepositoryServiceRepositoryService 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去启动流程
在这里插入图片描述

四、启动流程

@Testpublic 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.mzph.cn/news/79626.shtml

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

相关文章

Android 实战项目分享(一)用Android Studio绘制贝塞尔曲线的艺术之旅

一、项目概述 欢迎来到创意之源&#xff01;我们精心打造的绘图应用程序将带你进入一个充满艺术和技术的奇妙世界。通过使用Android Studio&#xff0c;我们实现了绘制贝塞尔曲线的功能&#xff0c;让你能够轻松创作出令人惊叹的艺术作品。不论你是热爱绘画的大学生还是渴望学习…

Java手写注解处理器和案例拓展

Java手写注解处理器和案例拓展 1. 手写注解处理器的必要性 在Java开发中&#xff0c;注解是一种元数据&#xff0c;它可以在代码中添加额外的信息&#xff0c;用于编译器、工具和框架的处理。通过自定义注解&#xff0c;我们可以实现一些特定的功能&#xff0c;如代码生成、配…

elementui el-dialog 动态生成多个,点击按钮打开对应的 dialog

业务场景&#xff1a; 根据后端返回的数据&#xff0c;动态生成表单&#xff0c;返回的数据中会有表单字段的类型&#xff0c;如果单选、多选、富文本&#xff0c;其它的属性还好说&#xff0c;重点说在富文本&#xff0c;因为我想通过 dialog 弹窗的方式&#xff0c;进行富文…

基于Java的设计模式-策略模式

策略模式就是定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 基本概念 策略模式主要是解决多种算法相似的情况下&#xff0c;使用if...else所带来的复杂和难以维护。当存在系统中有多个类&#xff0c;但是区分它们的是只是它们的直接行为&#xff0c;那我们…

Unity 性能优化之Shader分析处理函数ShaderUtil.HasProceduralInstancing: 深入解析与实用案例

Unity 性能优化之Shader分析处理函数ShaderUtil.HasProceduralInstancing: 深入解析与实用案例 点击封面跳转到Unity国际版下载页面 简介 在Unity中&#xff0c;性能优化是游戏开发过程中非常重要的一环。其中&#xff0c;Shader的优化对于游戏的性能提升起着至关重要的作用。…

VS2015+opencv 3.4.6开发环境

VS2015+opencv 3.4.6开发环境 一、安装包下载二、安装过程三、VS环境配置四、测试一、安装包下载 这里提供两种下载方法:   1. opencv官网   2. csdn资源下载 二、安装过程 2.1 下载opencv-3.4.6 安装包 2.2 双击开始安装,选择要安装目录,点击Extract。  2.3 等待解…

基于SSM的化妆品配方及工艺管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

算法|图论 1 广度深度

LeetCode 695- 岛屿的最大面积 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目描述&#xff1a;给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出…

69、Spring Data JPA 的 @Query查询 和 命名查询

Query查询 和 命名查询的区别&#xff1a; 命名查询与直接用Query来定义查询的本质是一样&#xff0c;只不过它们定义SQL或JPQL语句的位置不同。 直接用 Query来定义查询 &#xff0c;写SQL或JPQL语句的位置在 DAO 组件&#xff0c; 命名查询&#xff0c;写SQL或JPQL语句的位置…

神经网络与强化学习:揭示AI的超能力

文章目录 神经网络&#xff1a;模拟人脑的工具强化学习&#xff1a;通过试错学习结合神经网络和强化学习价值网络策略网络结合训练 应用领域游戏机器人控制金融交易 未来趋势自动化和自主系统个性化和自适应系统跨学科研究 结论 &#x1f389;欢迎来到AIGC人工智能专栏~神经网络…

【MATLAB第75期】#源码分享 | 基于MATLAB的不规则间隔数据插值实现时间序列数据扩充(更新中)

【MATLAB第75期】#源码分享 | 基于MATLAB的不规则间隔数据插值实现时间序列数据扩充 代码 %% 清空环境变量 warning off % 关闭报警信息 close all % 关闭开启的图窗 clear % 清空变量 clc % 清空命令行%%…

抽奖系统的设计与实现

1 绪论 随着人类社会步入21世纪,信息技术的飞速发展和社会信息化的不断提高&#xff0c;特别是进入网络信息时代&#xff0c;我们的工作越来越离不开计算机&#xff0c;这个时候就需要更好的运用现代化技术为各联系点服务&#xff0c;不断提高工作效率。计算机就充分体现了在这…

Tomcat修改配置文件

1.Tomcat启动乱码问题 1.1conf目录 说明&#xff1a;找到conf目录下logging.properties文件 1.2打开logging.properties文件 说明&#xff1a;将UTF-8修改成GBK 1.3.效果 2.端口冲突问题 2.1 conf目录 2.2打开 server.xml文件 2.3.修改端口 说明&#xff1a;port指的就是端…

使用node实现websocket

使用node实现websocket 什么是websocket websocket代表了Web应用程序通信方式的根本转变。不同于传统的HTTP请求响应周期&#xff0c;即客户端从服务器请求数据并等待响应&#xff0c;websocket在客户端和服务器之间建立一个持久的全双工连接。这意味着一旦建立了websocket&a…

LeetCode【4. 寻找两个正序数组的中位数】

快乐安康 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 public double findMedianSortedArrays(int[] nums1, int[] nums2) {if (nums1.length &…

如何实现 pdf 转 word

前言&#xff1a;最直接的方式 wps 充会员可以直接转&#xff0c;但是单纯为了 使用这个功能有没啥必要 pdf转word方法 在线转换wps转换其他收费转换方式 在线转换 介绍在线转换&#xff0c;虽然样式简陋但是可以转换成功&#xff0c;转换以后也没有失真 http://ssyr.mynatap…

linux安装sqoop

一 解压安装包 这里提供了网盘资源 链接: https://pan.baidu.com/s/1QkFqVnlvuOJ_aB2bjn-OKg?pwducsy 提取码: ucsy 这里有两个压缩包&#xff0c;sqoop-1.4.7.tar.gz是 sqoop 的安装包&#xff0c;另一个是我们需要里面的一些 jar 包 解压 安装包 tar -zxf ./sqoop-1.4.7.t…

LCP 01.猜数字

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;LCP 01. 猜数字 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 遍历比较即可。 解题代码&#xff1a; class Solution {public int game(int[] guess, int[] answer) {int res0;for(int …

1-FPGA硬件加速-YUV_YCbCr

这是对《基于Matlab与FPGA的图像处理教程》的学习笔记&#xff0c;代码和内容摘取自书中。 心得&#xff1a; 使用FPGA进行硬件加速的重点是消除或者减少浮点数运算&#xff0c;转换为定点运算&#xff0c;然后通过pipeline流水设计转为并行实现加速。 原理和方法 RGB与&…

使用原生的js实现分享功能,代码非常精简

分享一个原生的js实现移动端分享功能&#xff0c;希望大家喜欢。 兼容性&#xff1a; 实现代码&#xff1a; function share(){ if (!navigator.share) { alert("您当前浏览器不支持分享&#xff01;"); } else { navigator.share({title: {$title},text: {$introd…