文章目錄
- 簡介
- 流程圖
- 外部系統
- 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>