Camunda如何通過外部任務與其他系統自動交互

文章目錄

  • 簡介
  • 流程圖
  • 外部系統
    • 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.pswp.cn/web/45131.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45131.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45131.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux命令更新-Vim 編輯器

簡介 Vim 是 Linux 系統中常用的文本編輯器&#xff0c;功能強大、可擴展性強&#xff0c;支持多種編輯模式和操作命令&#xff0c;被廣泛應用于程序開發、系統管理等領域。 1. Vim 命令模式 Vim 啟動后默認進入命令模式&#xff0c;此時鍵盤輸入的命令將用于控制編輯器本身&…

Android ImageDecoder把瘦高/扁平大圖相當于fitCenter模式decode成目標小尺寸Bitmap,Kotlin

Android ImageDecoder把瘦高/扁平大圖相當于fitCenter模式decode成目標小尺寸Bitmap&#xff0c;Kotlin val sz Size(MainActivity.SIZE, MainActivity.SIZE)val src ImageDecoder.createSource(mContext?.contentResolver!!, uri)val bitmap ImageDecoder.decodeBitmap(sr…

【Playwright+Python】系列 Pytest 插件在Playwright中的使用

一、命令行使用詳解 使用 Pytest 插件在Playwright 中來編寫端到端的測試。 1、命令行執行測試 pytest --browser webkit --headed 2、使用 pytest.ini 文件配置 內容如下&#xff1a; [pytest] # Run firefox with UIaddopts --headed --browser firefox效果&#xff1…

云計算【第一階段(31)】PXE高效批量網絡裝機

一、系統安裝 1.1、系統裝機的三種引導方式 1. 硬盤 2. 光驅&#xff08; u 盤&#xff09; 3. 網絡啟動 pxe 1.2、系統安裝過程 加載boot loader Boot Loader 是在操作系統內核運行之前運行的一段小程序。通過這段小程序&#xff0c;我們可以初始化硬件設備、建立內存空間的映…

【CSS in Depth 2 精譯】3.1.2 邏輯屬性 + 3.1.3 用好邏輯屬性的簡寫形式

當前內容所在位置&#xff08;可進入專欄查看其他譯好的章節內容&#xff09; 第一章 層疊、優先級與繼承&#xff08;已完結&#xff09; 1.1 層疊1.2 繼承1.3 特殊值1.4 簡寫屬性1.5 CSS 漸進式增強技術1.6 本章小結 第二章 相對單位&#xff08;已完結&#xff09; 2.1 相對…

深入探討:CPU問題的深度分析與調優

引言 你是否曾經遇到過這樣的情況:系統運行突然變慢,用戶抱怨不斷,檢查后發現CPU使用率居高不下?這時候,你會如何解決?本文將詳細解析CPU問題的分析與調優方法,幫助你在面對類似問題時游刃有余。 案例分析:一次CPU性能瓶頸的解決過程 某知名互聯網公司在一次促銷活動…

《Python數據科學之一:初見數據科學與環境》

《Python數據科學之一&#xff1a;初見數據科學與環境》 歡迎來到“Python數據科學”系列的第一篇文章。在這個系列中&#xff0c;我們將通過Python的鏡頭&#xff0c;深入探索數據科學的豐富世界。首先&#xff0c;讓我們設置和理解數據科學的基本概念以及在開始任何數據科學項…

實變函數精解【4】

文章目錄 說明點集與測度可數集定義性質示例與有限集的關系應用 可列集定義種類不可列集性質應用與意義 有限集性質示例與無限集的區別應用 可數集&#xff08;Countable set&#xff09;和可列集&#xff08;Countably infinite set 或 Enumerable set&#xff09;可數集可列集…

怎樣把pptx課件轉換成word文檔

如果你還沒有安裝python-pptx和python-docx&#xff0c;請先運行以下命令&#xff1a; pip install python-pptx python-docx from pptx import Presentation from docx import Document import re# 函數&#xff1a;清理文本&#xff0c;移除特殊字符和控制字符 def clean…

每日Attention學習11——Lightweight Dilated Bottleneck

模塊出處 [TITS 23] [link] [code] Lightweight Real-Time Semantic Segmentation Network With Efficient Transformer and CNN 模塊名稱 Lightweight Dilated Bottleneck (LDB) 模塊作用 改進的編碼器塊 模塊結構 模塊代碼 import torch import torch.nn as nn import to…

qt 添加一個圖片控件

在Qt中&#xff0c;要添加一個圖片控件&#xff0c;你通常會使用QLabel或者QGraphicsView來顯示圖片。下面是使用QLabel來顯示圖片的一種方法&#xff1a; 使用 QLabel 顯示圖片 在Qt Designer中添加QLabel 打開你的Qt Designer。從工具箱中找到QLabel控件&#xff0c;并將其拖…

C#如何進行深度學習對行人進行識別?

C#通常不是用于深度學習的主要語言,但是通過一些庫和框架,你可以輕松地在C#中實現深度學習。以下是使用C#進行深度學習的一些更詳細的步驟: 選擇合適的庫: ML.NET:這是微軟推出的一個機器學習庫,它很容易集成到.NET應用程序中。ML.NET支持廣泛的機器學習任務,包括深度學…

使用DeepWalk 和Word2Vec實現單詞Embedding

0、準備“邊”數據集Wiki_edgelist import pandas as pddf pd.read_csv(./data/wiki/Wiki_edgelist.txt, sep , headerNone, names["source", "target"]) df.head() 1、讀入 起點-終點 邊數據&#xff0c;構建圖 # 1、讀入 起點-終點 邊數據&#xff0c…

GIS就業相關問題快問快答

目錄 前言1.現在處于經濟下行期&#xff0c;GIS就業崗位是否減少了&#xff1f;2.我未來的打算是進體制內研發崗&#xff0c;這方面需要掌握哪些技能呢&#xff1f;3.GIS前端需要掌握哪些知識&#xff1f;4.GIS后端需要掌握哪些知識&#xff1f;5.不論是前端還是后端&#xff0…

編程語言都是哪些人開發出來的?為什么都是國外較小國家的人

編程語言都是哪些人開發出來的&#xff1f; 編程語言的開發者通常是來自計算機科學、軟件工程、數學、物理學等領域的專家、學者和工程師。這些開發者具備深厚的編程技能、算法知識、系統設計能力以及創新思維&#xff0c;他們致力于創造出能夠解決特定問題或滿足特定需求的編…

Docker入門(清晰認識)

為什么學習Docker&#xff1f; 再學完linux后&#xff0c;我們需要遠程對Linux虛擬機下載一些軟件&#xff0c;如果在Linux里直接用命令下載軟件會十分麻煩&#xff0c;所以我們需要通過使用Docker將軟件直接下載到Docker中&#xff0c;這樣更方便下載和卸載等操作。 一張圖弄…

javaScript的面試重點--預解析

目錄 一.前言 二.預解析案例 一.前言 關于預解析&#xff0c;我們通過今天學習就能夠知道解析器運行JS分為哪兩步&#xff1b;能夠說出變量提升的步驟和運行過程&#xff1b;能夠說出函數提升的步驟和運行過程。 二.預解析案例 預解析&#xff0c;簡而言之&#xff0c;也就是…

7.13實訓日志

上午 學習網絡安全的過程中&#xff0c;我們深入了解了網絡的不同層面和技術&#xff0c;從表層網絡到深網再到暗網&#xff0c;以及涉及的產業分類和技術工具。這些知識不僅幫助我們理解網絡的復雜性&#xff0c;還揭示了如何應對和防范各種網絡威脅。 首先&#xff0c;我們…

簡易秒表的實現

目錄 描述 輸入描述&#xff1a; 輸出描述&#xff1a; 參考代碼 描述 請編寫一個模塊&#xff0c;實現簡易秒表的功能&#xff1a;具有兩個輸出&#xff0c;當輸出端口second從1-60循環計數&#xff0c;每當second計數到60&#xff0c;輸出端口minute加一&#xff0c;一直…

當在多線程環境中使用 C++進行編程時,怎樣確保線程安全以及如何處理線程之間的同步和通信?

在C中確保線程安全性和處理線程之間的同步和通信有多種方法。下面是一些常用的技術和技巧&#xff1a; 互斥鎖&#xff1a;使用互斥鎖可以確保只有一個線程可以訪問共享資源。在訪問共享資源之前獲取鎖&#xff0c;在完成后釋放鎖。這可以防止多個線程同時訪問同一份數據&#…