Camunda如何通过外部任务与其他系统自动交互

news2024/11/15 8:30:57

文章目录

  • 简介
  • 流程图
  • 外部系统
    • pom.xml
    • logback.xml
    • 监听类
  • 启动流程实例
  • 常见问题
    • Public Key Retrieval is not allowed的解决方法
    • java.lang.reflect.InaccessibleObjectException
  • 流程图xml

简介

前面我们已经介绍了Camunda的基本操作、任务、表:

  1. Camunda组件与服务与基本操作
  2. Camunda ScriptTask SendTask ReceiveTask操作
  3. Camunda中强大的监听服务
  4. 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来完成任务。

有几个参数需要说明一下:

  1. lockDuration不是轮询时间,只有一个默认的退火轮询策略,就是如果没有任务,轮询时间间隔会越来越长,直到接受到任务,重新开始计算时间
  2. businessKey:是业务流程启动时指定的实例业务key,多个实例可以使用相同的key
  3. processDefinitionKey:是业务流程定义时,指定的key,多个流程可以使用相同key,只是版本号不同
  4. processDefinitionId:是流程定义Camunda生成的id,这个每次都会变,不建议使用这个来过滤

流程定义key启动key
实例id

启动流程实例

不知道怎么搭建环境的可以先看一下下面这2篇:

  1. Camunda组件与服务与基本操作
  2. Camunda最基本、最常用的表梳理及如何通过服务定位到相关表

可以直接请求 post url:http://localhost:8088/engine-rest/process-definition/key/{流程id}/start

注意版本:启动实例接口文档

{
	"money": {
		"value": 1024,
		"type": "integer"
	},
	"item": {
		"value": "你干嘛"
	}
}

Camunda启动流程
Camunda指定启动参数
查看任务如果流程中没有设置执行人,这里可以指派。
完成任务
然后我们可以在外部系统查看有没有监听到:
Camunda外部任务监听我们可以看到外部系统已经接收到任务了,在回去看,可以发现,任务已经完成,流程结束。

常见问题

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

idea设置vm参数

流程图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>

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

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

相关文章

spring6之容器:IOC

容器&#xff1a;IOC 控制反转&#xff08;Ioc&#xff09; IoC容器在Spring的实现 Spring 的 IoC 容器就是 IoC思想的一个落地的产品实现。IoC容器中管理的组件也叫做 bean。在创建 bean 之前&#xff0c;首先需要创建IoC 容器。Spring 提供了IoC 容器的两种实现方式&#xf…

华为HCIP Datacom H12-821 卷39

1.填空题 请2001 :0DB8:0000:C030:0000: 000: 09A0:CDEF地址进行压缩。() (若答案中存在字母&#xff0c;请采用大写格式) 参考答案&#xff1a;2001 :DB8:0:C030: :9A0:CDEF 解析&#xff1a; IPv6地址的表示方法 IPv6地址总长度为128比特&#xff0c;通常分为8组&#xff0c…

防御综合实验作业2

办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP NAT策略&#xff1a; 安全策略&#xff1a; 测试&#xff1a; 分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 是怎么转换的&#xff0c;首先分公司的用户需…

温度如何影响输入失调电压

目录 一、概念理解 二、仿真理解 一、概念理解 在手册中有这样一个参数&#xff1a;输入失调电压漂移&#xff08;input offset voltage drift / offset drift&#xff09; 以上图为例&#xff0c;这个参数理解为&#xff1a;常温下&#xff08;25℃&#xff09;每增减1摄氏度…

【STM32开发笔记】搭建VSCode+PyOCD的STM32开发环境

【STM32开发笔记】搭建VSCodePyOCD的STM32开发环境 一、安装软件1.1 安装STM32CubeMX1.2 安装VSCode1.3 安装Arm GNU Toolchain1.4 安装Make for Windows1.5 安装Python1.6 安装PyOCD 二、安装插件2.1 VSCode插件2.2 PyOCD支持包 三、创建项目3.1 创建STM32CubeMX项目3.2 查阅原…

PostgreSQL 中如何处理数据的并发读写和锁等待超时?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何处理数据的并发读写和锁等待超时一、并发读写的基本概念&#xff08;一&#xff09;…

org/openxmlformats/schemas/spreadsheetml/x2006/main/CTWorkbook$Factory

org/openxmlformats/schemas/spreadsheetml/x2006/main/CTWorkbook$Factory POI的问题 在操作Excel时&#xff0c;出现这个问题是因为缺少了poi-ooxml-schema jar包&#xff0c;并且与poi的jar包版本一致

html02-标签继续学习

1.列表标签 1.1 列表标签的使用场景 场景&#xff1a;在网页中按照 行 展示关联性的内容&#xff0c;如&#xff1a;新闻列表、排行榜、账单等 特点&#xff1a;按照行的方式&#xff0c;整齐显示内容 种类&#xff1a;无序列表、有序列表、自定义列表 1.2无序列表 <!--…

LPRNet 车牌识别部署 rk3588(pt-onnx-rknn)包含各个步骤完整代码

虽然车牌识别技术很成熟了&#xff0c;但完全没有接触过。一直想搞一下、整一下、试一下、折腾一下&#xff0c;工作之余找了一个简单的例子入个门。本博客简单记录一下 LPRNet 车牌识别部署 rk3588流程&#xff0c;训练参考 LPRNet 官方代码。 1、导出onnx   导出onnx很容易…

短剧营销:品牌传播的新风口?

7月10日&#xff0c;麦当劳首部短剧《重生之我在麦当劳修炼魔法》&#xff0c;在微信视频号、小红书、抖音等平台上线。这部短剧以「短剧脱口秀」 的模式&#xff0c;将麦当劳的品牌形象与「土味霸总」 的网络热点相结合&#xff0c;上线一小时内&#xff0c;全平台播放量破千。…

Flutter实现局部刷新的几种方式

目录 前言 1.局部刷新的重要性 1.概念 2.重要性 2.局部刷新实现的几种方式 1.使用setState方法进行局部刷新 2.使用StatefulWidget和InheritedWidget局部刷新UI 3.ValueNotifier和ValueListenableBuilder 4.StreamBuilder 5.Provider 6.GetX 7.使用GlobalKey 前言 …

【PyQt】

PyQT5线程基础&#xff08;2&#xff09; 线程案例案例一案例二 线程案例 案例一 案例一代码通过线程实现点击按钮向线程传输地址&#xff0c;程序等待20秒后&#xff0c;返回结果。 通过QtDesigner创建如下图所示的界面ui&#xff0c;并用UIC工具转成对应的py文件。 Ui_tes…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十四)-无人机操控关键绩效指标(KPI)框架

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

GEO数据挖掘从数据下载处理质控到差异分析全流程分析步骤指南

综合的教学视频介绍 GEO数据库挖掘分析作图全流程每晚11点在线教学直播录屏回放视频&#xff1a; https://www.bilibili.com/video/BV1rm42157CT/ GEO数据从下载到各种挖掘分析全流程详解&#xff1a; https://www.bilibili.com/video/BV1nm42157ii/ 一篇今年近期发表的转…

技术成神之路:设计模式(六)策略模式

1.介绍 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;封装每一个算法&#xff0c;并使它们可以相互替换。策略模式使得算法的变化独立于使用算法的客户端。 2.主要作用 策略模式的主要作用是将算法或行为…

算法思想总结:字符串

一、最长公共前缀 . - 力扣&#xff08;LeetCode&#xff09; 思路1&#xff1a;两两比较 时间复杂度mn 实现findcomon返回两两比较后的公共前缀 class Solution { public:string longestCommonPrefix(vector<string>& strs) {//两两比较 string retstrs[0];size…

2.生产者核心流程总结

目录 概述 概述 生产者核心流程总结&#xff0c;根据流程总结出生产者的调优流程及生产者修改配置的文档地址&#xff0c;有以上两点&#xff0c;即可完成生产者优化。 注意&#xff1a;下面的都是生产者环节调优的点。 一条消息经过序例化后划分至 broker 上的哪一个分区消息…

Springboot + JWT 的 Token 登录验证

目录 项目结构 一、 引入依赖 二、自定义Auth认证注解 三、 编写登录拦截器 四、定义跨域拦截器 五、 定义全局异常处理器 六、定义工具类 1. 统一错误状态码 2.统一响应类 3.Token工具类 七、 编写实体类 八、 定义控制器 1.定义登录控制器类 2 定义报错处理器 …

vscode编译环境配置-golang

1. 支持跳转 如果单测函数上方不显示run test | debug test&#xff0c;需要安装Code Debugger&#xff08;因为以前的go Test Explorer不再被维护了&#xff09; 2. 单测 指定单个用例测试 go test -v run TestXXXdlv 调试 需要安装匹配的go版本和delve版本&#xff08;如…

6.S081的Lab学习——Lab11: Network

文章目录 前言Network提示&#xff1a;实现e1000_transmit的一些提示&#xff1a;实现e1000_recv的一些提示&#xff1a; 解析 总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招。打算尝试6.S081&#xff0c;将它的Lab逐一实现&#xff0c;并记录期间心酸历程。 代码下…