Camunda中的Execution listeners和Task listeners

news/2024/10/24 20:09:55

在Camunda中大多数节点元素都可以设置执行监听器(Execution listeners),例如事件、顺序流、用户任务、服务任务和网关。其中用户任务除了可以设置执行监听器,还可以设置独有的用户任务监听器,相比于执行监听器,用户任务监听器可以设置更加细粒度的事件类型。

下面针对执行监听器和用户任务监听器,结合图片和代码进行说明。

1、Execution listeners

执行监听器支持的Listener type如下,有Java class、Expression、Delegate expression和Script,下面针对这几种的配置和代码实现进行说明

1.1、Java class

Java class配置完整的包名和类名,并选择Event type是开始或结束事件类型,对应节点执行前和执行后。

关键点:新增一个java类,实现JavaDelegate接口,并重写execute方法,利用spring@Component注解注入bean,配置当前类的完整路径即可。

根据eventName区分是什么事件,在里面实现对应的逻辑,代码示例如下:

package org.example.executionlistener;import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.ExecutionListener;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import org.springframework.stereotype.Component;@Component
@Slf4j
public class ExecutionTaskService implements JavaDelegate {@Overridepublic void execute(DelegateExecution execution) throws Exception {String eventName = execution.getEventName();String currentActivityName = execution.getCurrentActivityName();if (ExecutionListener.EVENTNAME_END.equals(eventName)) {} else if (ExecutionListener.EVENTNAME_START.equals(eventName)) {} else if (ExecutionListener.EVENTNAME_TAKE.equals(eventName)) {}log.info("SystemTaskService execute,taskName={},eventName={}", currentActivityName, eventName);}
}

 1.2 Expression

针对自定义的java类和方法,支持通过表达式的方式配置,配置如下:

关键点:EL表达式不需要实现JavaDelegate接口,直接使用Spring Bean的名称和方法名称即可,根据eventName区分是start事件还是end事件,在里面实现自己的逻辑。

注:camunda内置了一部分上下文参数,可以在表达式中直接使用,文档链接:Expression Language | docs.camunda.org

代码示例如下:

package org.example.executionlistener;import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.springframework.stereotype.Component;@Component("expressionExecutionService")
@Slf4j
public class ExpressionService {public void expression(DelegateExecution execution) {String eventName = execution.getEventName();String currentActivityName = execution.getCurrentActivityName();log.info("Execution ExpressionService,taskName={},eventName={}", currentActivityName, eventName);}}

 1.3 Delegate expression

委托表达式配置如下:

关键点:DelegateExpression和Expression类似,区别在于需要实现JavaDelegate接口,此时只需要传入bean的名称即可,不需要指定方法名和参数。

示例代码如下:

package org.example.executionlistener;import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.ExecutionListener;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import org.springframework.stereotype.Component;@Component("executionTaskService")
@Slf4j
public class ExecutionTaskService implements JavaDelegate {@Overridepublic void execute(DelegateExecution execution) throws Exception {String eventName = execution.getEventName();String currentActivityName = execution.getCurrentActivityName();if (ExecutionListener.EVENTNAME_END.equals(eventName)) {} else if (ExecutionListener.EVENTNAME_START.equals(eventName)) {} else if (ExecutionListener.EVENTNAME_TAKE.equals(eventName)) {}log.info("SystemTaskService execute,taskName={},eventName={}", currentActivityName, eventName);}
}

 1.4 Script

camunda支持在执行监听器中编写脚本进行处理,如下可以在Script框中编写脚本,没有使用过,不进行详细说明,感兴趣可以自行研究

2、Task listeners

任务监听器是独属于用户任务的,其支持的事件类型和监听器类型分别如下所示:

从上面可以看到,与执行监听器相比,任务监听器支持的事件类型更加丰富,意味这个可以在用户任务的各个阶段处理我们自定义的逻辑;其监听器类型和Execution listeners一样,同样支持四种方式。

下面给出Java Class和Delegate expression两种方式的实现。

2.1、Java class

用户任务监听器和执行监听器的Java class配置和代码实现类似,区别在于实现的接口不同,eventName的种类更多,示例配置如下所示:

关键点:新增一个java类,实现TaskListener接口,并重写notify方法,利用spring@Component注解注入bean,最后配置当前类的完整路径即可。

代码示例如下:

package org.example.usertask;import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.delegate.DelegateTask;
import org.camunda.bpm.engine.delegate.TaskListener;
import org.springframework.stereotype.Component;@Component
@Slf4j
public class JavaClassListener implements TaskListener {@Overridepublic void notify(DelegateTask delegateTask) {String eventName = delegateTask.getEventName();String name = delegateTask.getName();if (TaskListener.EVENTNAME_CREATE.equals(eventName)) {} else if (TaskListener.EVENTNAME_ASSIGNMENT.equals(eventName)) {} else if (TaskListener.EVENTNAME_COMPLETE.equals(eventName)) {} else if (TaskListener.EVENTNAME_DELETE.equals(eventName)) {} else if (TaskListener.EVENTNAME_TIMEOUT.equals(eventName)) {} else if (TaskListener.EVENTNAME_UPDATE.equals(eventName)) {}log.info("UserTaskListener UserTaskListener,userTaskName={},eventName={}", name, eventName);}
}

2.2 Delegate expression

其在委托表达式的配置示例如下所示:

关键点:只需要实现TaskListener接口,利用spring的@Component注解,传入设置的Bean的名称即可。

代码示例如下:

package org.example.usertask;import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.delegate.DelegateTask;
import org.camunda.bpm.engine.delegate.TaskListener;
import org.springframework.stereotype.Component;@Component("userTaskListener")
@Slf4j
public class UserTaskListener implements TaskListener {@Overridepublic void notify(DelegateTask delegateTask) {String eventName = delegateTask.getEventName();String name = delegateTask.getName();if (TaskListener.EVENTNAME_CREATE.equals(eventName)) {} else if (TaskListener.EVENTNAME_ASSIGNMENT.equals(eventName)) {} else if (TaskListener.EVENTNAME_COMPLETE.equals(eventName)) {} else if (TaskListener.EVENTNAME_DELETE.equals(eventName)) {} else if (TaskListener.EVENTNAME_TIMEOUT.equals(eventName)) {} else if (TaskListener.EVENTNAME_UPDATE.equals(eventName)) {}log.info("UserTaskListener UserTaskListener,userTaskName={},eventName={}", name, eventName);}
}

2.3 Expression

用户任务监听器的表达式写法和上面执行监听器的表达式写法一样,区别在于其用到的上下文参数不一样,执行监听器用到的方法参数是DelegateExecution execution,用户任务监听器用到的方法参数是DelegateTask task,详细见上面的Camunda内置的上下文参数,其示例配置如下:

 示例代码如下:

package org.example.usertask;import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.delegate.DelegateTask;
import org.springframework.stereotype.Component;@Component("expressionService")
@Slf4j
public class ExpressionService {public void expression(DelegateTask task) {String eventName = task.getEventName();String name = task.getName();//根据eventName来进行自定义逻辑log.info("ExpressionService expression,userTaskName={},eventName={}", name, eventName);}
}

2.4 Script

和上面的执行监听器类似,不再赘述。

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

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

相关文章

AMD Ryzen 5700X黑苹果运行Docker和Virtualization(虚拟化)

最近把我的AMD Ryzen黑苹果系统升级到Sequoia 15.01 发现virtualbox不能用了,遂重新分区又安装了一个Sonoma 14.7AMD Ryzen Run Virtualization展示 Virtualization Limit系统要求: BigSur <= 当前运行系统版本 <= Sonoma 虚拟化软件: virtualbox 6.1.50 安全要求:关…

GISBox对比CesiumLab,哪款GIS工具箱更适合你?

在地理信息系统(GIS)领域,越来越多的用户开始关注GIS工具箱的选择,其中GISBox和CesiumLab是两款备受推崇的产品。那么,哪一款更适合你的需求呢?本文将从功能、使用体验和应用场景等方面,对GISBox和CesiumLab进行详细对比,帮助你做出更明智的选择。 GISBox:功能强大,简…

一,超级详细的ClickHouse安装部署文档(RPM版安装),新手小白一看就能学会!!!

ClickHouse安装部署博客笔记(RPM版) 前言 ClickHouse是一个高性能的列式数据库,专为在线分析处理(OLAP)而设计。它能够实时生成分析数据报告,并支持对大数据进行快速的查询。本文将带你一步步完成ClickHouse的单机安装部署,确保你能够顺利上手这个强大的数据库系统。 第…

STM32配置HID设备时主机识别不到力反馈的解决办法

这个问题困扰我快一个星期了,我仔仔细细阅读了Device Class Definition for Physical Interface Devices (PID) Version 1.0和HID Usage Tables FOR Universal Serial Bus (USB)。 都没有找到识别不到力反馈的原因,按理说配置完报告描述符就能显示力反馈了,但是我这边死活识…

VSCode Java环境配置

JDK 部分 1. 下载 java jdk jdk23下载地址 windows 选择 Windows / x64 zip 文件 2. 解压 将 zip 文件移动到你想要的路径下并解压,如: E:\openjdk-23.0.1_windows-x64_bin 解压后复制 bin 文件路径,如: E:\openjdk-23.0.1_windows-x64_bin\jdk-23.0.1\bin 3. 配置环境变…

第8课 项目管理工具禅道

一、禅道的介绍 (1)定义禅道是一个项目管理工具,也是一个bug管理工具,还是一个用例管理工具。 (2)作用:为了解决众多企业在管理中出现混乱,无序的现象,开发出来 (3)来源:禅道属易软天创公司 (4 )禅道是集于产品管理,项目管理,测试管理于一身,同时包含事务管理…

支付通道网络(PCN)研究

背景 为了缓解主链吞吐量和交易费用的弊端,支付通道网络的技术被提出。交易的双方节点可以通过智能合约搭建一个支付通道,双方各锁定一定数量的初始资金,进行无限次的链下交易,这些交易不会被发布在区块链上,直到通道关闭,才会最终提交到链上。 PCN的问题多跳支付依赖于中…

23~24 炼石计划 NOIP 练习题部分题解

其实还是不加密码了目录 目录第 1 组JOISC2017 火车旅行IOI2018 会议CF1558F Strange SortAPIO2018 新家CTSC2017 密钥CF1748E Yet Another Array Counting Problem第 2 组NOI2016 区间LOJ552 MIN&MAX IJOISC2023 合唱LOJ542 序列划分LOJ560 Menci 的序列P8978 中位数第 3 …