Camunda如何通过外部任务与其他系统自动交互
文章目录
- 简介
- 流程图
- 外部系统
- pom.xml
- logback.xml
- 监听类
- 启动流程实例
- 常见问题
- Public Key Retrieval is not allowed的解决方法
- java.lang.reflect.InaccessibleObjectException
- 流程图xml
简介
前面我们已经介绍了Camunda的基本操作、任务、表:
- Camunda组件与服务与基本操作
- Camunda ScriptTask SendTask ReceiveTask操作
- Camunda中强大的监听服务
- Camunda最基本、最常用的表梳理及如何通过服务定位到相关表
这一篇我们介绍一下Camunda的外部任务。
很多时候,任务并不是业务老师来完成,而是外部系统来完成。
这种情况,如何交互呢?
提供接口吗?
Camunda提供了更好的方式,外部服务:只需要在流程图中创建一个服务节点,配置为External就可以。
然后,其他系统可以监听指定的topic,流程到了,就可以获取到通知,完成之后,还可以自动完成任务。
流程图
设置为type为External,并指定topic。
具体流程图xml我放在最后,需要自取。
外部系统
首先,我们模拟一个外部系统监听任务。
pom.xml
最主要是camunda-external-task-client
<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>vip.meet</groupId><artifactId>camunda-out-task</artifactId><version>1.0.0</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.camunda.bpm</groupId><artifactId>camunda-external-task-client</artifactId><version>7.15.0</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.5.6</version></dependency><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.4.0-b180830.0359</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.34</version></dependency></dependencies><build><plugins></plugins></build></project>
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration><property name="log.path" value="D:/logs/camunda-out-task" /><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{50} - %msg%n</pattern></encoder></appender><!--控制框架输出日志--><logger name="org.slf4j" level="INFO"/><logger name="org.springframework" level="INFO"/><root><appender-ref ref="STDOUT" level="INFO" /></root>
</configuration>
监听类
package vip.meet;import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.client.ExternalTaskClient;@Slf4j
public class UpWorker {public static void main(String[] args) {ExternalTaskClient client = ExternalTaskClient.create()// 依据实际情况填写程序的IP和端口.baseUrl("http://localhost:8088/engine-rest").asyncResponseTimeout(10000).lockDuration(10000).workerId("监听流程任务").build();client// 要处理的主题.subscribe("起床了")// 流程实例启动设置的业务key
// .businessKey("out-task-key")
// 流程定义时设置的业务key.processDefinitionKeyIn("pi-out-001")
// .processDefinitionId("pi-out-001:2:ae842ab3-4179-11ef-b67d-ac74b10c44ef").lockDuration(30000)// 处理任务逻辑.handler((externalTask, externalTaskService) -> {String item = externalTask.getVariable("item");Integer money = externalTask.getVariable("money");log.info("获取任务参数:item:{},money:{}", money, item);// 完成任务externalTaskService.complete(externalTask);}).open();}
}
其中:subscribe是要订阅的主题,还可以设置businessKey、processDefinitionKey、processDefinitionId等参数来监听指定流程。
处理逻辑可以通过ExternalTask获取相关流程参数,ExternalTaskService来完成任务。
有几个参数需要说明一下:
- lockDuration不是轮询时间,只有一个默认的退火轮询策略,就是如果没有任务,轮询时间间隔会越来越长,直到接受到任务,重新开始计算时间
- businessKey:是业务流程启动时指定的实例业务key,多个实例可以使用相同的key
- processDefinitionKey:是业务流程定义时,指定的key,多个流程可以使用相同key,只是版本号不同
- processDefinitionId:是流程定义Camunda生成的id,这个每次都会变,不建议使用这个来过滤
启动流程实例
不知道怎么搭建环境的可以先看一下下面这2篇:
- Camunda组件与服务与基本操作
- Camunda最基本、最常用的表梳理及如何通过服务定位到相关表
可以直接请求 post url:http://localhost:8088/engine-rest/process-definition/key/{流程id}/start
注意版本:启动实例接口文档
{"money": {"value": 1024,"type": "integer"},"item": {"value": "你干嘛"}
}
如果流程中没有设置执行人,这里可以指派。
然后我们可以在外部系统查看有没有监听到:
我们可以看到外部系统已经接收到任务了,在回去看,可以发现,任务已经完成,流程结束。
常见问题
Public Key Retrieval is not allowed的解决方法
数据库url链接中添加allowPublicKeyRetrieval=true参数。
java.lang.reflect.InaccessibleObjectException
Cause: java.lang.reflect.InaccessibleObjectException: Unable to make public int java.util.XXXX.size() accessible: module java.base does not “opens java.util” to unnamed module @xxxx
MyBatis Ognl反射出错,设置vm参数:–add-opens java.base/java.util=ALL-UNNAMED
流程图xml
<?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_1avcqjw" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.19.0" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0"><bpmn:process id="pi-out-001" name="外部任务流程" isExecutable="true" camunda:historyTimeToLive="180"><bpmn:startEvent id="StartEvent_1"><bpmn:outgoing>Flow_1giqjon</bpmn:outgoing></bpmn:startEvent><bpmn:sequenceFlow id="Flow_1giqjon" sourceRef="StartEvent_1" targetRef="Activity_1lwbfpu" /><bpmn:userTask id="Activity_1lwbfpu" name="前置任务" camunda:assignee="demo"><bpmn:incoming>Flow_1giqjon</bpmn:incoming><bpmn:outgoing>Flow_1c1kuaz</bpmn:outgoing></bpmn:userTask><bpmn:sequenceFlow id="Flow_1c1kuaz" sourceRef="Activity_1lwbfpu" targetRef="Activity_0oezzr5" /><bpmn:serviceTask id="Activity_0oezzr5" name="外部任务" camunda:type="external" camunda:topic="起床了"><bpmn:incoming>Flow_1c1kuaz</bpmn:incoming><bpmn:outgoing>Flow_0yftk9w</bpmn:outgoing></bpmn:serviceTask><bpmn:endEvent id="Event_17b6xzm"><bpmn:incoming>Flow_0yftk9w</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0yftk9w" sourceRef="Activity_0oezzr5" targetRef="Event_17b6xzm" /></bpmn:process><bpmndi:BPMNDiagram id="BPMNDiagram_1"><bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="pi-out-001"><bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1"><dc:Bounds x="179" y="102" width="36" height="36" /></bpmndi:BPMNShape><bpmndi:BPMNShape id="Activity_05oodpp_di" bpmnElement="Activity_1lwbfpu"><dc:Bounds x="310" y="80" width="100" height="80" /><bpmndi:BPMNLabel /></bpmndi:BPMNShape><bpmndi:BPMNShape id="Activity_1oc0pm3_di" bpmnElement="Activity_0oezzr5"><dc:Bounds x="510" y="80" width="100" height="80" /><bpmndi:BPMNLabel /></bpmndi:BPMNShape><bpmndi:BPMNShape id="Event_17b6xzm_di" bpmnElement="Event_17b6xzm"><dc:Bounds x="712" y="102" width="36" height="36" /></bpmndi:BPMNShape><bpmndi:BPMNEdge id="Flow_1giqjon_di" bpmnElement="Flow_1giqjon"><di:waypoint x="215" y="120" /><di:waypoint x="310" y="120" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_1c1kuaz_di" bpmnElement="Flow_1c1kuaz"><di:waypoint x="410" y="120" /><di:waypoint x="510" y="120" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_0yftk9w_di" bpmnElement="Flow_0yftk9w"><di:waypoint x="610" y="120" /><di:waypoint x="712" y="120" /></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</bpmn:definitions>
相关文章:

Camunda如何通过外部任务与其他系统自动交互
文章目录 简介流程图外部系统pom.xmllogback.xml监听类 启动流程实例常见问题Public Key Retrieval is not allowed的解决方法java.lang.reflect.InaccessibleObjectException 流程图xml 简介 前面我们已经介绍了Camunda的基本操作、任务、表: Camunda组件与服务与…...
Django ORM中ExpressionWrapper的用途
ExpressionWrapper 在 Django ORM 中,直接在 filter 方法中进行字段间的比较时,不能直接使用算术运算符(如 、-、*、/)来操作 F 对象,需要使用 ExpressionWrapper 来包装表达式并指定输出字段类型。 使用Q对象&#…...

什么软件修复视频画质比较好,视频画质修复工具
有些视频中可能会出现噪点、残影、颜色失真等问题,导致观看时体验感不太好,修复视频画质可以去除这些问题,使视频更加干净、清晰和真实。 高质量的视频画质能够提高观众的观看体验,让观众更加享受观看视频的过程。特别是在需要展示…...

效能工具:执行 npm start 可直接切换proxy代理UR后直接启动项目
1) 背景: 我们项目是2个前端3个后端的配置。前端和每个后端都有需要调试的接口。 因此经常切换vite.congig.js中的proxy后端代理链接,是挺麻烦的。 于是我研究如何能快速切换后端URL,所幸懒人有懒福,我找到了Inquirer 和 fs, 实…...

MongoDB自学笔记(一)
一、MongoDB简介 MongoDB是一款基于C开发的文档型数据库。与传统的关系型数据库有所不同,MongoDB面向的是文档,所谓的文档是一种名为BSON (Binary JSON:二进制JSON格式)是非关系数据库当中功能最丰富,最像…...

【AIGC】二、mac本地采用GPU启动keras运算
mac本地采用GPU启动keras运算 一、问题背景二、技术背景三、实验验证本机配置安装PlaidML安装plaidml-keras配置默认显卡 运行采用 CPU运算的代码step1 先导入keras包,导入数据cifar10,这里可能涉及外网下载,有问题可以参考[keras使用基础问题…...
【Qt】使用临时对象的坑
前言 使用临时对象时,一定要注意临时对象析构后是否会对代码造成影响,下面是一些可能出现的错误 std::string Widget::getStr() {return "nihao"; }void Widget::on_pushButton_clicked() {std::string objStr getStr();const char* str g…...

Apache-Flink未授权访问高危漏洞修复
漏洞等级 高危漏洞!!! 一、漏洞描述 攻击者没有获取到登录权限或未授权的情况下,或者不需要输入密码,即可通过直接输入网站控制台主页面地址,或者不允许查看的链接便可进行访问,同时进行操作。 二、修复建议 根据业务/系统具体情况,结合如下建议做出具体选择: 配…...

Unable to obtain driver using Selenium Manager: Selenium Manager failed解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

(01)Unity使用在线AI大模型(使用百度千帆服务)
目录 一、概要 二、环境说明 三、申请百度千帆Key 四、使用千帆大模型 四、给大模型套壳 一、概要 在Unity中使用在线大模型分为两篇发布,此篇文档为在Python中使用千帆大模型,整体实现逻辑是:在Python中接入大模型—>发布为可传参的…...

Zed 编辑器发布了原生 Linux 版本
由 Rust 编写、GPU 加速的 Zed 文本编辑器终于提供了正式的 Linux 原生版本!在过去的几个月里,Zed 的 Linux 支持取得了长足的进步,现在已经进入了更正式的阶段。 今天,这款由前 Atom 开发人员创建的现代开源代码编辑器现在在 Li…...

安全入门day01
一、常用名词 1、前后端 (1)前端 前端主要负责用户界面的展示和交互。它通常包括HTML、CSS和JavaScript等技术的使用,也可能使用各种前端框架和库,如React、Vue.js、Angular等,来构建更加复杂和动态的用户界面。前端…...

基于Adaboost的数据分类算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于Adaboost的数据分类算法matlab仿真,分别对比线性分类和非线性分类两种方式。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 (完整程序…...

基于Java的斗地主游戏案例开发(做牌、洗牌、发牌、看牌
package Game;import java.util.ArrayList; import java.util.Collections;public class PokerGame01 {//牌盒//♥3 ♣3static ArrayList<String> list new ArrayList<>();//静态代码块//特点:随着类的加载而在加载的,而且只执行一次。stat…...

Ubuntu 22.04.4 LTS (linux) 安装certbot 免费ssl证书申请 letsencrypt
1 安装certbot sudo apt update sudo apt-get install certbot 2 申请letsencrypt证书 sudo certbot certonly --webroot -w 网站目录 -d daloradius.域名.com 3 修改nginx 配置ssl 证书 # 配置服务器证书 ssl_certificate /etc/letsencrypt/live/daloradius.域名.com/f…...

MT6825磁编码IC在智能双旋机器人中的应用
MT6825磁编码IC在智能双旋机器人中的应用,无疑为这一领域的创新和发展注入了新的活力。作为一款高性能的磁性位置传感器,MT6825以其独特的优势,在智能双旋机器人的运动控制、定位精度以及系统稳定性等方面发挥了关键作用。 www.abitions.com …...

Datawhale 2024 年 AI 夏令营第二期——基于术语词典干预的机器翻译挑战赛
#AI夏令营 #Datawhale #夏令营 1.赛事简介 目前神经机器翻译技术已经取得了很大的突破,但在特定领域或行业中,由于机器翻译难以保证术语的一致性,导致翻译效果还不够理想。对于术语名词、人名地名等机器翻译不准确的结果,可以通…...

Qt 多窗体、复用窗口的使用
1.继承自QWidge的窗口的呈现,作为tabPage呈现,作为独立窗口呈现 2.继承自QMainWindow的窗口的呈现,作为abPage呈现,作为独立窗口呈现 1. 继承自QWidge的窗口的呈现 1.1 作为tabPage呈现 void MutiWindowExample::on_actWidgetI…...
python 基础语法整理
注释声明命名规范数据类型简单数据类型复合数据类型 打印输出类型转换随机数获取布尔类型流程控制语句循环语句字符串操作拼接替换分割与连接大小写转换空白字符删除 切片列表操作访问/赋值判断是否存在元素添加/删除复制排序 元组集合字典空集合与空字典 函数声明多返回值函数…...

【Linux】常见指令(下)
【Linux】常见指令(下) 通配符 *man指令cp指令echo指令cat指令(简单介绍)cp指令 mv指令alias指令which ctrl ccat指令linux下一切皆文件 more指令less指令head指令tail指令管道 通配符 ‘*’ 通配符’ *‘,是可以匹配…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...