Camunda中强大的监听服务

2024-01-30 20:36
文章标签 服务 监听 强大 camunda

本文主要是介绍Camunda中强大的监听服务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 简介
  • 创建工程
  • JavaDelegate
  • TaskListener
  • ExecutionListener
  • 部署发起流程
    • CustomExecutionListener开始节点
    • CustomExecutionListener
    • CustomJavaDelegate
    • CustomExecutionListener
    • CustomTaskListener用户节点
  • Expression
  • Delegate Expression
  • 流程图

简介

Camunda预览了很多接口,以便于我们扩展,其中最重要的莫过于各种监听接口,本文就将接受三个最终常用的接口:

  1. ExecutionListener
  2. JavaDelegate
  3. TaskListener

并介绍下面3个ListenerType的区别:

  1. Java Class
  2. Expression
  3. Delegate expression

创建工程

我们还是使用SpringBoot来创建工程,可以通过下面链接生成一个集成Camunda的SpringBoot工程

SpringBoot Camunda工程生成

也可以直接拷贝下面的pom自己创建:

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example.workflow</groupId><artifactId>my-project</artifactId><version>1.0.0-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>3.1.1</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.camunda.bpm</groupId><artifactId>camunda-bom</artifactId><version>7.20.0</version><scope>import</scope><type>pom</type></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boot-starter-rest</artifactId></dependency><dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId></dependency><dependency><groupId>org.camunda.bpm</groupId><artifactId>camunda-engine-plugin-spin</artifactId></dependency><dependency><groupId>org.camunda.spin</groupId><artifactId>camunda-spin-dataformat-all</artifactId></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>3.1.1</version></plugin></plugins></build></project>

如果不想使用默认的H2数据库,可以参考下面修改配置文件:application.yaml

#spring.datasource.url: jdbc:h2:file:./camunda-h2-databasecamunda.bpm.admin-user:id: demopassword: demo#camunda.bpm.database:
#  schema-update: drop-createspring.datasource:url: jdbc:mysql://127.0.0.1:3306/clearn?characterEncoding=UTF-8&useUnicode=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driverusername: timpassword: pd

两点需要注意:

  1. 需要添加相关数据库驱动lib
  2. camunda.bpm.database.schema-update好像不生效,需要手动创建一下Camunda相关表

自己测试,如果怕麻烦,直接使用默认的H2数据库即可。

然后就可以直接启动了:

@SpringBootApplication
public class Application {public static void main(String... args) {SpringApplication.run(Application.class, args);}}

JavaDelegate

对于Camunda的服务节点,我们可以绑定一个Java类,这个Java类只需要实现org.camunda.bpm.engine.delegate.JavaDelegate接口即可。

Type选Java Class:
服务节点

import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;public class CustomJavaDelegate implements JavaDelegate {@Overridepublic void execute(DelegateExecution delegateExecution) throws Exception {System.out.println(CustomJavaDelegate.class.getName() + "--start");System.out.println("getProcessInstanceId:" + delegateExecution.getProcessInstanceId());System.out.println("getActivityInstanceId:" + delegateExecution.getActivityInstanceId());System.out.println("getCurrentActivityId:" + delegateExecution.getCurrentActivityId());System.out.println("getCurrentActivityName:" + delegateExecution.getCurrentActivityName());System.out.println("getProcessBusinessKey:" + delegateExecution.getProcessBusinessKey());System.out.println("getProcessDefinitionId:" + delegateExecution.getProcessDefinitionId());System.out.println("getBusinessKey:" + delegateExecution.getBusinessKey());System.out.println("getEventName:" + delegateExecution.getEventName());Double paramA = (Double) delegateExecution.getVariable("paramA");String paramB = (String) delegateExecution.getVariable("paramB");System.out.println(paramA);System.out.println(paramB);delegateExecution.setVariable("CustomJavaDelegateP1","p1");delegateExecution.setVariable("CustomJavaDelegateP2",500);System.out.println(CustomJavaDelegate.class.getName() + "--end");}
}

TaskListener

对于用户节点,我们可以配置TaskListener,来监听用户节点的一些事件,如:

  1. create
  2. assignment
  3. delete
  4. complete
  5. update
  6. timeout

user task

import org.camunda.bpm.engine.delegate.DelegateTask;
import org.camunda.bpm.engine.delegate.TaskListener;public class CustomTaskListener implements TaskListener {@Overridepublic void notify(DelegateTask delegateTask) {System.out.println(CustomTaskListener.class.getName() + "--start");System.out.println("processInstanceId:" + delegateTask.getProcessInstanceId());System.out.println("getAssignee:" + delegateTask.getAssignee());System.out.println("getId:" + delegateTask.getId());System.out.println("getName:" + delegateTask.getName());System.out.println("getEventName:" + delegateTask.getEventName());System.out.println("getPriority:" + delegateTask.getPriority());System.out.println("getCaseDefinitionId:" + delegateTask.getCaseDefinitionId());System.out.println("getCaseExecutionId:" + delegateTask.getCaseExecutionId());System.out.println("getDueDate:" + delegateTask.getDueDate());System.out.println("getTaskDefinitionKey:" + delegateTask.getTaskDefinitionKey());System.out.println("getOwner:" + delegateTask.getOwner());System.out.println("getDescription:" + delegateTask.getDescription());System.out.println(CustomTaskListener.class.getName() + "--end");}
}

ExecutionListener

基本所有节点都可以配置Execution listener:

执行listener

import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.ExecutionListener;public class CustomExecutionListener implements ExecutionListener {@Overridepublic void notify(DelegateExecution delegateExecution) throws Exception {System.out.println(CustomExecutionListener.class.getName() + "--start");System.out.println("getProcessInstanceId:" + delegateExecution.getProcessInstanceId());System.out.println("getProcessDefinitionId:" + delegateExecution.getProcessDefinitionId());System.out.println("getActivityInstanceId:" + delegateExecution.getActivityInstanceId());System.out.println("getCurrentActivityId:" + delegateExecution.getCurrentActivityId());System.out.println("getCurrentActivityName:" + delegateExecution.getCurrentActivityName());System.out.println("getProcessBusinessKey:" + delegateExecution.getProcessBusinessKey());System.out.println("getBusinessKey:" + delegateExecution.getBusinessKey());// 获取参数delegateExecution.getVariable("paramA");// 设置参数delegateExecution.setVariable("paramZ","paramZValue");// 可以获取ProcessEngine、RuntimeService来执行更多的操作RuntimeService runtimeService = delegateExecution.getProcessEngine().getRuntimeService();System.out.println(runtimeService);System.out.println(CustomExecutionListener.class.getName() + "--end");}
}

部署发起流程

部署工作流

部署成功

发起工作流

CustomExecutionListener开始节点

com.example.workflow.delegate.CustomExecutionListener--start
getProcessInstanceId:646f4f07-bf4c-11ee-a70e-00ffe7687986
getProcessDefinitionId:Process_1dnzxeh:3:830657fb-bf4a-11ee-b1f6-00ffe7687986
getActivityInstanceId:null
getCurrentActivityId:StartEvent_1
getCurrentActivityName:null
getProcessBusinessKey:listener-30
getBusinessKey:listener-30
org.camunda.bpm.engine.impl.RuntimeServiceImpl@1d380352
com.example.workflow.delegate.CustomExecutionListener--end

CustomExecutionListener

com.example.workflow.delegate.CustomExecutionListener--start
getProcessInstanceId:646f4f07-bf4c-11ee-a70e-00ffe7687986
getProcessDefinitionId:Process_1dnzxeh:3:830657fb-bf4a-11ee-b1f6-00ffe7687986
getActivityInstanceId:StartEvent_1:64747f30-bf4c-11ee-a70e-00ffe7687986
getCurrentActivityId:StartEvent_1
getCurrentActivityName:null
getProcessBusinessKey:listener-30
getBusinessKey:listener-30
org.camunda.bpm.engine.impl.RuntimeServiceImpl@1d380352
com.example.workflow.delegate.CustomExecutionListener--end

CustomJavaDelegate

com.example.workflow.delegate.CustomJavaDelegate--start
getProcessInstanceId:646f4f07-bf4c-11ee-a70e-00ffe7687986
getActivityInstanceId:Activity_1claer7:6475dec2-bf4c-11ee-a70e-00ffe7687986
getCurrentActivityId:Activity_1claer7
getCurrentActivityName:bzService
getProcessBusinessKey:listener-30
getProcessDefinitionId:Process_1dnzxeh:3:830657fb-bf4a-11ee-b1f6-00ffe7687986
getBusinessKey:listener-30
getEventName:null
3.14
haha
com.example.workflow.delegate.CustomJavaDelegate--end

CustomExecutionListener

com.example.workflow.delegate.CustomExecutionListener--start
getProcessInstanceId:646f4f07-bf4c-11ee-a70e-00ffe7687986
getProcessDefinitionId:Process_1dnzxeh:3:830657fb-bf4a-11ee-b1f6-00ffe7687986
getActivityInstanceId:Activity_1xjraoy:6476c927-bf4c-11ee-a70e-00ffe7687986
getCurrentActivityId:Activity_1xjraoy
getCurrentActivityName:userTask
getProcessBusinessKey:listener-30
getBusinessKey:listener-30
org.camunda.bpm.engine.impl.RuntimeServiceImpl@1d380352
com.example.workflow.delegate.CustomExecutionListener--end

CustomTaskListener用户节点

com.example.workflow.delegate.CustomTaskListener--start
processInstanceId:646f4f07-bf4c-11ee-a70e-00ffe7687986
getAssignee:null
getId:64771749-bf4c-11ee-a70e-00ffe7687986
getName:userTask
getEventName:create
getPriority:50
getCaseDefinitionId:null
getCaseExecutionId:null
getDueDate:null
getTaskDefinitionKey:Activity_1xjraoy
getOwner:null
getDescription:null
com.example.workflow.delegate.CustomTaskListener--end

Expression

Expression的优势在于不用继承特别的类,就可以调用相关方法。

注意:需要将类注入容器

import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.springframework.stereotype.Component;/*** #{expressionDelegateExecution.exe(execution)}*/
@Component("expressionDelegateExecution")
public class ExpressionDelegateExecution {public void exe(DelegateExecution execution){String processInstanceId = execution.getProcessInstanceId();System.out.println("ExpressionDelegateExecution:" + processInstanceId);}
}

表达式配置

Delegate Expression

Delegate Expression可以看做是加强版的Expression。

它最大的一个特点是对于实现了:

  1. ExecutionListener
  2. JavaDelegate
  3. TaskListener

上面的类,Delegate Expression可以直接配置bean名称就可以,Camunda会自动调用其方法。

还是需要注入容器才行。

import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import org.springframework.stereotype.Component;/*** #{delegateExpressionComponent}*/
@Component("delegateExpressionComponent")
public class DelegateExpressionComponent implements JavaDelegate {@Overridepublic void execute(DelegateExecution execution) throws Exception {System.out.println("DelegateExpressionComponent:" + execution.getProcessInstanceId());}
}

delegate表达式配置

流程图

<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_13pugtj" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.19.0" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.20.0"><bpmn:process id="Process_1dnzxeh" name="service" isExecutable="true" camunda:historyTimeToLive="180"><bpmn:extensionElements><camunda:executionListener class="com.example.workflow.delegate.CustomExecutionListener" event="end" /><camunda:executionListener class="com.example.workflow.delegate.CustomExecutionListener" event="start" /></bpmn:extensionElements><bpmn:startEvent id="StartEvent_1"><bpmn:extensionElements><camunda:executionListener class="com.example.workflow.delegate.CustomExecutionListener" event="start" /></bpmn:extensionElements><bpmn:outgoing>Flow_0eji7wy</bpmn:outgoing></bpmn:startEvent><bpmn:serviceTask id="Activity_1claer7" name="bzService" camunda:class="com.example.workflow.delegate.CustomJavaDelegate"><bpmn:incoming>Flow_0eji7wy</bpmn:incoming><bpmn:outgoing>Flow_0c190eu</bpmn:outgoing></bpmn:serviceTask><bpmn:sequenceFlow id="Flow_0eji7wy" sourceRef="StartEvent_1" targetRef="Activity_1claer7" /><bpmn:sequenceFlow id="Flow_0c190eu" sourceRef="Activity_1claer7" targetRef="Activity_1xjraoy" /><bpmn:userTask id="Activity_1xjraoy" name="userTask"><bpmn:extensionElements><camunda:taskListener class="com.example.workflow.delegate.CustomTaskListener" event="create" id="Lid255" /><camunda:executionListener class="com.example.workflow.delegate.CustomExecutionListener" event="start" /></bpmn:extensionElements><bpmn:incoming>Flow_0c190eu</bpmn:incoming><bpmn:outgoing>Flow_0383lfn</bpmn:outgoing></bpmn:userTask><bpmn:endEvent id="Event_0aws3kb"><bpmn:extensionElements><camunda:executionListener class="com.example.workflow.delegate.CustomExecutionListener" event="start" /></bpmn:extensionElements><bpmn:incoming>Flow_0383lfn</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0383lfn" sourceRef="Activity_1xjraoy" targetRef="Event_0aws3kb" /></bpmn:process><bpmndi:BPMNDiagram id="BPMNDiagram_1"><bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1dnzxeh"><bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1"><dc:Bounds x="179" y="99" width="36" height="36" /></bpmndi:BPMNShape><bpmndi:BPMNShape id="Activity_04xt5m2_di" bpmnElement="Activity_1claer7"><dc:Bounds x="280" y="77" width="100" height="80" /><bpmndi:BPMNLabel /></bpmndi:BPMNShape><bpmndi:BPMNShape id="Activity_1frv2ve_di" bpmnElement="Activity_1xjraoy"><dc:Bounds x="450" y="77" width="100" height="80" /><bpmndi:BPMNLabel /></bpmndi:BPMNShape><bpmndi:BPMNShape id="Event_0aws3kb_di" bpmnElement="Event_0aws3kb"><dc:Bounds x="602" y="99" width="36" height="36" /></bpmndi:BPMNShape><bpmndi:BPMNEdge id="Flow_0eji7wy_di" bpmnElement="Flow_0eji7wy"><di:waypoint x="215" y="117" /><di:waypoint x="280" y="117" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_0c190eu_di" bpmnElement="Flow_0c190eu"><di:waypoint x="380" y="117" /><di:waypoint x="450" y="117" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_0383lfn_di" bpmnElement="Flow_0383lfn"><di:waypoint x="550" y="117" /><di:waypoint x="602" y="117" /></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</bpmn:definitions>

这篇关于Camunda中强大的监听服务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/661473

相关文章

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例 3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例 4.基于SSM的高校实验室管理系统+LW参考示例 5.基于SpringBoot的二手数码回收系统+原生微信小程序+LW参考示例 6.基于SSM的民宿预订管理系统+LW参考示例 7.基于

IntelliJ IDEA - 强大的编程工具

哪个编程工具让你的工作效率翻倍? 在日益繁忙的工作环境中,选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度,甚至让团队协作更加顺畅。那么,哪款编程工具让你的工作效率翻倍?是智能的代码编辑器,强大的版本控制工具,还是那些让你事半功倍的自动化脚本?在这里我推荐一款好用的编程工具:IntelliJ IDEA。 方向一:工具介绍 Int

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

Golang服务平滑重启

与重载配置相同的是我们也需要通过信号来通知server重启,但关键在于平滑重启,如果只是简单的重启,只需要kill掉,然后再拉起即可。平滑重启意味着server升级的时候可以不用停止业务。 我们先来看下Github上有没有相应的库解决这个问题,然后找到了如下三个库: facebookgo/grace - Graceful restart & zero downtime deploy for G

Java后端微服务架构下的API限流策略:Guava RateLimiter

Java后端微服务架构下的API限流策略:Guava RateLimiter 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在微服务架构中,API限流是保护服务不受过度使用和拒绝服务攻击的重要手段。Guava RateLimiter是Google开源的Java库中的一个组件,提供了简单易用的限流功能。 API限流概述 API限流通过控制请求的速率来防止

【微服务】Ribbon(负载均衡,服务调用)+ OpenFeign(服务发现,远程调用)【详解】

文章目录 1.Ribbon(负载均衡,服务调用)1.1问题引出1.2 Ribbon负载均衡1.3 RestTemplate整合Ribbon1.4 指定Ribbon负载均衡策略1.4.1 配置文件1.4.2 配置类1.4.3 定义Ribbon客户端配置1.4.4 自定义负载均衡策略 2.OpenFeign面向接口的服务调用(服务发现,远程调用)2.1 OpenFeign的使用2.1 .1创建

java后端服务监控与告警:Prometheus与Grafana集成

Java后端服务监控与告警:Prometheus与Grafana集成 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在现代的微服务架构中,监控和告警是确保服务稳定性的关键组成部分。Prometheus和Grafana是两个强大的工具,它们可以集成在一起,为Java后端服务提供实时监控和可视化告警。 服务监控的重要性 服务监控可以帮助我们实时了解服务的健

OpenStack离线Train版安装系列—3控制节点-Keystone认证服务组件

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版