「DAY10」逐步實踐:簡單流程實作

Posted on September 23, 2023 • 3 min read • 517 words
Share via

我們今天來實作一個小小的範例吧~~

我們今天來實作一個小小的範例吧~~

創建一個新的 BPMN 圖

單擊*File > New File > BPMN Diagram(Camunda 平台)*創建新的 BPMN 圖。3

https://ithelp.ithome.com.tw/upload/images/20230924/20163254dvv1QPI2NI.png

從一個簡單的過程開始-支付事件

首先對一個簡單的流程進行建模。

https://ithelp.ithome.com.tw/upload/images/20230924/201632546ArDkCpQ0a.png

雙擊開始事件。將打開一個文本框。將開始事件命名為“請求付款檢索”(Payment Retrieval Requested)。

💡 編輯標籤時,您可以使用 來添加換行符Shift + Enter

單擊開始事件。從其上下文菜單中,選擇活動(activity)形狀(圓角矩形)。它將自動放置在畫布上,您可以將其拖動到您喜歡的位置。將其命名為收費信用卡(Charge Credit Card)。通過單擊活動形狀並使用扳手*(wrench)按鈕,將活動類型更改為服務任務(Service Task)。*

💡 服務命名以”英文”為主,避免encoding的問題

https://ithelp.ithome.com.tw/upload/images/20230924/20163254pezo2NYSjV.png

https://ithelp.ithome.com.tw/upload/images/20230924/20163254WTCX7WdUpy.png

添加一個名為Payment Received的結束事件。

https://ithelp.ithome.com.tw/upload/images/20230924/20163254Qbkv0lnJbv.png

https://ithelp.ithome.com.tw/upload/images/20230924/201632546dRU7McTQU.png

配置服務任務

使用 Camunda 平台可以通過不同的方式執行服務任務。在本文中,我們將使用外部任務模式。打開 Camunda Modeler 中的屬性面板,然後單擊剛剛創建的服務任務”Charge Credit Card”。在右側的面板中修改Implementation(實現)為 External ,修改Topic為 charge-card。

https://ithelp.ithome.com.tw/upload/images/20230924/20163254GKLnfAdUGl.png

https://ithelp.ithome.com.tw/upload/images/20230924/20163254KmZLtRtAKO.png

配置執行屬性

💡 記住,不要選取或點擊BPMN服務,作環境配置

https://ithelp.ithome.com.tw/upload/images/20230924/20163254RwwwOcbHDx.png

因為我們正在建模一個可執行進程,所以我們應該給它一個ID並將isExecutable屬性設置為true。在畫布的右側,您可以找到屬性面板。當您單擊建模畫布上的空白區域時,屬性面板將顯示流程本身的屬性。

首先,為進程配置一個ID。在屬性字段Id中輸入payment-retrieval。流程引擎使用屬性 ID 作為可執行流程的標識符,最佳實踐是將其設置為人類可讀的名稱。

其次,配置進程的名稱。在屬性字段名稱中輸入payment-retrieval。

最後,確保選中“可執行文件”屬性旁邊的框。如果不選中此框,流程引擎將忽略流程定義。

保存 BPMN 圖

完成後,單擊File > Save File As...。在出現的對話框中,到您選擇的文件夾並將圖表另存為類似payment.bpmn

💡 到此第一部分結束,如果想直接獲取到現在為止的進度,可以使用如下命令

git checkout -f Step-1

https://ithelp.ithome.com.tw/upload/images/20230924/20163254W0smpJ5dlY.png

用Java或NodeJS實施外部任務工作

在對流程進行建模之後,我們想要執行一些業務邏輯。

Camunda 平台的構建使您的業務邏輯可以用不同的語言實現。您可以選擇最適合您的項目的語言。

Camunda 官方展示如何在以下領域使用 Camunda 的即用型任務客戶端(需要的朋友可以自行取用):

💡 可以使用 Camunda 的REST API通過 HTTP 訪問 API 操作。

使用Java實現外部任務工作線程

先決條件 確保您已安裝以下工具:

JDK 1.8 用於 Java 項目的 IDE(例如Eclipse)

創建一個新的 Maven 項目

首先在 IDE 中創建一個新的 Maven 項目。

用 Eclipse,則可以按照以下步驟操作:

在 Eclipse 中,點選File / New / Maven Project。

https://ithelp.ithome.com.tw/upload/images/20230924/20163254TBa3Y9bMrd.png

在新建 Maven 項目嚮導的第一頁上,勾選Create a simple project(您可以跳過繁複的選擇)。點擊下一步。

https://ithelp.ithome.com.tw/upload/images/20230924/20163254CGLHL49h8r.png

在第二頁上,配置 Maven 參數,Group Id通常是網域的顛倒後面再加上名稱,Artifact Id 設定為charge-card-worker,設置 JAR 項目,選擇 Packaging: jar。

https://ithelp.ithome.com.tw/upload/images/20230924/20163254rgPEVLBH1M.png

添加 Camunda 外部任務客戶端依賴項

如果您看到右下角的進度條還在跑,表示maven還沒開好,請等IDE配置好後在進行下一步。

https://ithelp.ithome.com.tw/upload/images/20230924/20163254dodgncgUZn.png

進入pom.xml

https://ithelp.ithome.com.tw/upload/images/20230924/20163254F7vK1o6bA5.png

為新流程應用程序設置對外部任務客戶端的 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>

添加 Java 類

接下來,我們將創建一個新的ExternalTaskClient來訂閱該charge-card主題。

點擊File - >New - > Class

https://ithelp.ithome.com.tw/upload/images/20230924/20163254S74DkY6jR4.png

當流程引擎遇到配置為外部處理的服務任務時,它會創建一個外部任務實例,我們的處理程序將對其做出反應。我們在ExternalTaskClient中使用長輪詢來提高通信效率。

接下來,您需要創建一個包,例如org.camunda.bpm.getstarted.chargecard並向其中添加一個 Java 類,例如ChargeCardWorker

直接貼上”org.camunda.bpm.getstarted.chargecard.ChargeCardWorker*”在Name欄*

https://ithelp.ithome.com.tw/upload/images/20230924/20163254rwbhOiAlbX.png

直接將下述的程式碼貼入ChargeCardWorker.java

https://ithelp.ithome.com.tw/upload/images/20230924/201632545GsT3L2Pq0.png

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

https://ithelp.ithome.com.tw/upload/images/20230924/20163254iItxT1Z5N0.png


使用 JavaScript (NodeJS)

在本節中,您將學習如何在 NodeJS 中實現外部任務工作線程。

先決條件

確保您已安裝以下工具:

筆者NodeJS選擇的是windows 64bit msi版本,請依據您的設備選擇相對應的版本、JavaScript 文件編輯器使用vscode

https://ithelp.ithome.com.tw/upload/images/20230924/20163254ozAL3vOaKM.png

創建一個新的 NodeJS 項目

mkdir charge-card-worker
cd ./charge-card-worker
npm init -y

https://ithelp.ithome.com.tw/upload/images/20230924/20163254y1AiFrog8A.png

添加 Camunda 外部任務客戶端 JS 庫

npm install camunda-external-task-client-js
npm install -D open

https://ithelp.ithome.com.tw/upload/images/20230924/20163254QtPt5r0J4Y.png

實施 NodeJS 腳本

接下來,我們將創建一個訂閱該charge-card主題的新ExternalTaskClient。

當流程引擎遇到配置為外部處理的服務任務時,它會創建一個外部任務實例,我們的處理程序將對其做出反應。我們在ExternalTaskClient中使用Long Polling來使通信更加高效。

新建的文件要放在node_modules

https://ithelp.ithome.com.tw/upload/images/20230924/20163254klX3GufNox.png

接下來,您需要創建一個新的 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 腳本

您可以使用以下命令運行 NodeJS 腳本:

node ./worker.js

💡 到此第二b部分結束,如果想直接獲取到現在為止的進度,可以使用如下命令

git checkout -f Step-2b

https://ithelp.ithome.com.tw/upload/images/20230924/20163254rtYvqXsN2V.png

💡 如果有任何問題,歡迎在下方留言!! 筆者頭一回寫技術文,如果內容有誤,或者內容的呈現上有所缺陷,如果您願意,歡迎在下方留言給我呦~~

anything.best

這是我的部落格,歡迎點擊閱覽喔~~會不定期更新文章

Follow me

I work on everything coding and tweet developer memes