「DAY10」逐步實踐:簡單流程實作
Posted on September 23, 2023 • 3 min read • 517 words我們今天來實作一個小小的範例吧~~
我們今天來實作一個小小的範例吧~~
單擊*File > New File > BPMN Diagram(Camunda 平台)*創建新的 BPMN 圖。3
首先對一個簡單的流程進行建模。
雙擊開始事件。將打開一個文本框。將開始事件命名為“請求付款檢索”(Payment Retrieval Requested)。
💡 編輯標籤時,您可以使用 來添加換行符Shift + Enter
。
單擊開始事件。從其上下文菜單中,選擇活動(activity)形狀(圓角矩形)。它將自動放置在畫布上,您可以將其拖動到您喜歡的位置。將其命名為收費信用卡(Charge Credit Card)。通過單擊活動形狀並使用扳手*(wrench)按鈕,將活動類型更改為服務任務(Service Task)。*
💡 服務命名以”英文”為主,避免encoding的問題
添加一個名為Payment Received的結束事件。
使用 Camunda 平台可以通過不同的方式執行服務任務。在本文中,我們將使用外部任務模式。打開 Camunda Modeler 中的屬性面板,然後單擊剛剛創建的服務任務”Charge Credit Card”。在右側的面板中修改Implementation(實現)為 External ,修改Topic為 charge-card。
💡 記住,不要選取或點擊BPMN服務,作環境配置
因為我們正在建模一個可執行進程,所以我們應該給它一個ID並將isExecutable
屬性設置為true
。在畫布的右側,您可以找到屬性面板。當您單擊建模畫布上的空白區域時,屬性面板將顯示流程本身的屬性。
首先,為進程配置一個ID。在屬性字段Id中輸入payment-retrieval。流程引擎使用屬性 ID 作為可執行流程的標識符,最佳實踐是將其設置為人類可讀的名稱。
其次,配置進程的名稱。在屬性字段名稱中輸入payment-retrieval。
最後,確保選中“可執行文件”屬性旁邊的框。如果不選中此框,流程引擎將忽略流程定義。
完成後,單擊File > Save File As...。在出現的對話框中,到您選擇的文件夾並將圖表另存為類似payment.bpmn
💡 到此第一部分結束,如果想直接獲取到現在為止的進度,可以使用如下命令
git checkout -f Step-1
在對流程進行建模之後,我們想要執行一些業務邏輯。
Camunda 平台的構建使您的業務邏輯可以用不同的語言實現。您可以選擇最適合您的項目的語言。
Camunda 官方展示如何在以下領域使用 Camunda 的即用型任務客戶端(需要的朋友可以自行取用):
💡 可以使用 Camunda 的REST API通過 HTTP 訪問 API 操作。
先決條件 確保您已安裝以下工具:
JDK 1.8 用於 Java 項目的 IDE(例如Eclipse)
首先在 IDE 中創建一個新的 Maven 項目。
用 Eclipse,則可以按照以下步驟操作:
在 Eclipse 中,點選File / New / Maven Project。
在新建 Maven 項目嚮導的第一頁上,勾選Create a simple project(您可以跳過繁複的選擇)。點擊下一步。
在第二頁上,配置 Maven 參數,Group Id通常是網域的顛倒後面再加上名稱,Artifact Id 設定為charge-card-worker,設置 JAR 項目,選擇 Packaging: jar。
如果您看到右下角的進度條還在跑,表示maven還沒開好,請等IDE配置好後在進行下一步。
進入pom.xml
為新流程應用程序設置對外部任務客戶端的 Maven 依賴關係。項目的 pom.xml 文件應如下所示:
<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>org.camunda.bpm.getstarted</groupId>
<artifactId>charge-card-worker</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<camunda.external-task-client.version>7.19.0</camunda.external-task-client.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-external-task-client</artifactId>
<version>${camunda.external-task-client.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
</project>
接下來,我們將創建一個新的ExternalTaskClient來訂閱該charge-card
主題。
點擊File - >New - > Class
當流程引擎遇到配置為外部處理的服務任務時,它會創建一個外部任務實例,我們的處理程序將對其做出反應。我們在ExternalTaskClient中使用長輪詢來提高通信效率。
接下來,您需要創建一個包,例如org.camunda.bpm.getstarted.chargecard並向其中添加一個 Java 類,例如ChargeCardWorker。
直接貼上”org.camunda.bpm.getstarted.chargecard.ChargeCardWorker*”在Name欄*
直接將下述的程式碼貼入ChargeCardWorker.java
package org.camunda.bpm.getstarted.chargecard;
import java.util.logging.Logger;
import java.awt.Desktop;
import java.net.URI;
import org.camunda.bpm.client.ExternalTaskClient;
public class ChargeCardWorker {
private final static Logger LOGGER = Logger.getLogger(ChargeCardWorker.class.getName());
public static void main(String[] args) {
ExternalTaskClient client = ExternalTaskClient.create()
.baseUrl("http://localhost:8080/engine-rest")
.asyncResponseTimeout(10000) // long polling timeout
.build();
// subscribe to an external task topic as specified in the process
client.subscribe("charge-card")
.lockDuration(1000) // the default lock duration is 20 seconds, but you can override this
.handler((externalTask, externalTaskService) -> {
// Put your business logic here
// Get a process variable
String item = externalTask.getVariable("item");
Integer amount = externalTask.getVariable("amount");
LOGGER.info("Charging credit card with an amount of '" + amount + "'€ for the item '" + item + "'...");
try {
Desktop.getDesktop().browse(new URI("https://docs.camunda.org/get-started/quick-start/complete"));
} catch (Exception e) {
e.printStackTrace();
}
// Complete the task
externalTaskService.complete(externalTask);
})
.open();
}
}
您可以通過右鍵單擊該類ChargeCardWorker
並選擇 來運行 Java 應用程序Run as Java
。
請注意,工作線程應在本快速入門指南的整個過程中保持運行狀態。
💡 到此第二部分結束,如果想直接獲取到現在為止的進度,可以使用如下命令
git checkout -f Step-2a
在本節中,您將學習如何在 NodeJS 中實現外部任務工作線程。
確保您已安裝以下工具:
筆者NodeJS選擇的是windows 64bit msi版本,請依據您的設備選擇相對應的版本、JavaScript 文件編輯器使用vscode
mkdir charge-card-worker
cd ./charge-card-worker
npm init -y
npm install camunda-external-task-client-js
npm install -D open
接下來,我們將創建一個訂閱該charge-card
主題的新ExternalTaskClient。
當流程引擎遇到配置為外部處理的服務任務時,它會創建一個外部任務實例,我們的處理程序將對其做出反應。我們在ExternalTaskClient中使用Long Polling來使通信更加高效。
新建的文件要放在node_modules
接下來,您需要創建一個新的 JavaScript 文件,例如worker.js
,如下所示:
const { Client, logger } = require('camunda-external-task-client-js');
const open = require('open');
// configuration for the Client:
// - 'baseUrl': url to the Process Engine
// - 'logger': utility to automatically log important events
// - 'asyncResponseTimeout': long polling timeout (then a new request will be issued)
const config = { baseUrl: 'http://localhost:8080/engine-rest', use: logger, asyncResponseTimeout: 10000 };
// create a Client instance with custom configuration
const client = new Client(config);
// susbscribe to the topic: 'charge-card'
client.subscribe('charge-card', async function({ task, taskService }) {
// Put your business logic here
// Get a process variable
const amount = task.variables.get('amount');
const item = task.variables.get('item');
console.log(`Charging credit card with an amount of ${amount}€ for the item '${item}'...`);
open('https://docs.camunda.org/get-started/quick-start/success');
// Complete the task
await taskService.complete(task);
});
您可以使用以下命令運行 NodeJS 腳本:
node ./worker.js
💡 到此第二b部分結束,如果想直接獲取到現在為止的進度,可以使用如下命令
git checkout -f Step-2b
💡 如果有任何問題,歡迎在下方留言!! 筆者頭一回寫技術文,如果內容有誤,或者內容的呈現上有所缺陷,如果您願意,歡迎在下方留言給我呦~~
這是我的部落格,歡迎點擊閱覽喔~~會不定期更新文章