業務可視化-讓你的流程圖”Run”起來(4.實際業務場景測試)

  • 2022 年 7 月 28 日
  • 筆記

前言

首先,感謝大家對上一篇文章[業務可視化-讓你的流程圖”Run”起來(3.分支選擇&跨語言分佈式運行節點)]的支持。

下面我以實際業務場景為例,來介紹一下ladybugflow的使用方法。

酒店預定場景(傳統寫法)

對於下面的酒店預定流程

流程1:

流程2

 

[流程1]的傳統寫法1:

定義流程間共享變量;
開始處理();

查詢客戶信息處理();
查詢酒店信息處理();

下單處理();
下單成功處理();

假設每個流程用3秒鐘,整個流程執行完需要3*5=15秒。

於是衍生出了寫法2:

定義流程間共享變量;
開始處理();

啟動 查詢客戶信息線程處理 A;
啟動 查詢酒店信息線程處理 B;
等待A,B結束;

下單處理();
下單成功處理();

節省了時間,但各種多線程的實現方式使程序變得複雜,

而且上述寫法都把流程圖與業務邏輯進行了綁定

也就是流程圖中添加,刪除節點後,相應的邏輯代碼也要修改,測試範圍往往是整個流程圖的業務邏輯都要進行測試。

酒店預定場景(新寫法)

針對上面的問題,我在設計ladybugflow的時候,把流程圖和業務邏輯進行了分離

每個業務邏輯對應一個方法,與流程圖中的節點進行綁定。

這樣修改流程圖就不用修改業務邏輯了。

而且流程圖可以通過工具拖拽方式生成,還可以在圖上查看運行結果。

下面介紹一下ladybugflow中的開發過程

1. 導入依賴

Maven
<!-- //mvnrepository.com/artifact/io.github.nobuglady/ladybugflow -->
<dependency>
    <groupId>io.github.nobuglady</groupId>
    <artifactId>ladybugflow</artifactId>
    <version>0.0.6</version>
</dependency>
Gradle
// //mvnrepository.com/artifact/io.github.nobuglady/ladybugflow
implementation 'io.github.nobuglady:ladybugflow:0.0.6'

2. 畫流程圖,並且生成Json文件

首先把這個文件下載到本地,用瀏覽器打開

//github.com/nobuglady/ladybugflow/blob/main/html/network.html

然後點擊頁面上的[edit]按鈕可以畫流程圖,

畫完流程圖後,點擊[update json]按鈕,可以生成流程圖對應的json文件。

3. 寫業務方法

流程圖的每個節點對應下面的一個方法,用@Node註解來關聯流程圖。

可以用類變量進行參數傳遞和表示結果,比如下單成功後,設置類變量為”success”。

註:建議用節點ID進行關聯,本文為了看起來方便,選擇了中文的節點名稱進行關聯

Flow1.java(注意文件編碼為UTF-8)


/**
 * 
 * @author NoBugLady
 *
 */
public class Flow1 extends FlowRunner {

	private String result;
	
	public String getResult() {
		return result;
	}
	
	@Node(label = "start")
	public void processStart() throws InterruptedException {
		System.out.println("啟動開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("啟動結束");
	}

	@Node(label = "查詢用戶信息")
	public void processSearchUser() throws InterruptedException {
		System.out.println("查詢用戶信息開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("查詢用戶信息結束");
	}

	@Node(label = "查詢酒店信息")
	public void processSearchHotel() throws InterruptedException {
		System.out.println("查詢酒店信息開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("查詢酒店信息結束");
	}

	@Node(label = "下單")
	public void processOrder() throws InterruptedException {
		System.out.println("下單開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("下單結束");
	}

	@Node(label = "下單成功")
	public void processSuccess() throws InterruptedException {
		System.out.println("下單成功開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("下單成功結束");
		result = "success";
	}
}

4. 將流程圖的Json文件放入工程

Flow1.json(注意文件編碼為UTF-8)

{
	"flowId": "your flow id",
	"nodes": [
		{
			"id": "1",
			"label": "start"
		},
		{
			"id": "a1a38c2e-0e05-4c68-bd49-f12aea070876",
			"label": "查詢用戶信息",
			"readyCheck": 0
		},
		{
			"id": "1a90a997-4390-470a-ae7c-626a725438d2",
			"label": "查詢酒店信息",
			"readyCheck": 0
		},
		{
			"id": "52289e99-363d-4453-8077-ca8bdc6d35bf",
			"label": "下單",
			"readyCheck": 0
		},
		{
			"id": "16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2",
			"label": "下單成功",
			"readyCheck": 0
		}
	],
	"edges": [
		{
			"id": "1",
			"from": "1",
			"to": "2",
			"arrows": "to"
		},
		{
			"id": "b3ad7ab3-8fb6-4527-8cae-6845e03da3e4",
			"from": "1",
			"to": "a1a38c2e-0e05-4c68-bd49-f12aea070876",
			"arrows": "to"
		},
		{
			"id": "001375c7-19e7-436b-bbcd-68e36c8f23b7",
			"from": "1",
			"to": "1a90a997-4390-470a-ae7c-626a725438d2",
			"arrows": "to"
		},
		{
			"id": "dd830043-c7a7-4c71-b91c-10c007b7b19c",
			"from": "1a90a997-4390-470a-ae7c-626a725438d2",
			"to": "52289e99-363d-4453-8077-ca8bdc6d35bf",
			"arrows": "to"
		},
		{
			"id": "21c2c69d-0050-4eca-8283-5a2bcbdc6c37",
			"from": "52289e99-363d-4453-8077-ca8bdc6d35bf",
			"to": "16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2",
			"arrows": "to"
		},
		{
			"id": "19f2f329-8163-4dc6-a353-800df79d18a6",
			"from": "a1a38c2e-0e05-4c68-bd49-f12aea070876",
			"to": "52289e99-363d-4453-8077-ca8bdc6d35bf",
			"arrows": "to"
		}
	]
}

項目結構如下圖所示

Flow1.java和Flow1.json需要放到同一個包下。

5. 啟動流程

App1.java(注意文件編碼為UTF-8)

/**
 * 
 * @author NoBugLady
 *
 */
public class App1 {

	public static void main(String[] args) {
		
		Flow1 testFlow = new Flow1();
		testFlow.startFlow(true);
		
		System.out.println(testFlow.getResult());
		
		// 不建議每次都調用shutdown,可以在整個App關閉的時候調用一次shutdown
		FlowStarter.shutdown();
		
	}
}

6. 查看運行結果

[I]2022/07/27 21:23:12.172  main:ladybugflow.properties in root path not found, use default configuration
[I]2022/07/27 21:23:12.177  main:NodePool started.
[I]2022/07/27 21:23:12.178  main:Ready queue consumer thread started.
[I]2022/07/27 21:23:12.180  main:Complete queue consumer thread started.
[I]2022/07/27 21:23:12.993 [your flow id][38f3567d-77fb-4629-bf7e-68b27633ed68] main:json:
{"flowId":"your flow id","nodes":[{"id":"1","label":"start","readyCheck":0},{"id":"a1a38c2e-0e05-4c68-bd49-f12aea070876","label":"查詢用戶信息","readyCheck":0},{"id":"1a90a997-4390-470a-ae7c-626a725438d2","label":"查詢酒店信息","readyCheck":0},{"id":"52289e99-363d-4453-8077-ca8bdc6d35bf","label":"下單","readyCheck":0},{"id":"16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2","label":"下單成功","readyCheck":0}],"edges":[{"id":"1","from":"1","to":"2","condition":null,"arrows":"to"},{"id":"b3ad7ab3-8fb6-4527-8cae-6845e03da3e4","from":"1","to":"a1a38c2e-0e05-4c68-bd49-f12aea070876","condition":null,"arrows":"to"},{"id":"001375c7-19e7-436b-bbcd-68e36c8f23b7","from":"1","to":"1a90a997-4390-470a-ae7c-626a725438d2","condition":null,"arrows":"to"},{"id":"dd830043-c7a7-4c71-b91c-10c007b7b19c","from":"1a90a997-4390-470a-ae7c-626a725438d2","to":"52289e99-363d-4453-8077-ca8bdc6d35bf","condition":null,"arrows":"to"},{"id":"21c2c69d-0050-4eca-8283-5a2bcbdc6c37","from":"52289e99-363d-4453-8077-ca8bdc6d35bf","to":"16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2","condition":null,"arrows":"to"},{"id":"19f2f329-8163-4dc6-a353-800df79d18a6","from":"a1a38c2e-0e05-4c68-bd49-f12aea070876","to":"52289e99-363d-4453-8077-ca8bdc6d35bf","condition":null,"arrows":"to"}]}
[I]2022/07/27 21:23:12.996 [your flow id][38f3567d-77fb-4629-bf7e-68b27633ed68] pool-1-thread-1:execute node id:1
[I]2022/07/27 21:23:12.996 [your flow id][38f3567d-77fb-4629-bf7e-68b27633ed68] pool-1-thread-1:execute node name:start
啟動開始 (模擬業務等待3秒)
啟動結束
[I]2022/07/27 21:23:16.003 [your flow id][38f3567d-77fb-4629-bf7e-68b27633ed68] pool-1-thread-1:execute node id:a1a38c2e-0e05-4c68-bd49-f12aea070876
[I]2022/07/27 21:23:16.003 [your flow id][38f3567d-77fb-4629-bf7e-68b27633ed68] pool-1-thread-1:execute node name:查詢用戶信息
[I]2022/07/27 21:23:16.003 [your flow id][38f3567d-77fb-4629-bf7e-68b27633ed68] pool-1-thread-2:execute node id:1a90a997-4390-470a-ae7c-626a725438d2
查詢用戶信息開始 (模擬業務等待3秒)
[I]2022/07/27 21:23:16.004 [your flow id][38f3567d-77fb-4629-bf7e-68b27633ed68] pool-1-thread-2:execute node name:查詢酒店信息
查詢酒店信息開始 (模擬業務等待3秒)
查詢酒店信息結束
查詢用戶信息結束
[I]2022/07/27 21:23:19.008 [your flow id][38f3567d-77fb-4629-bf7e-68b27633ed68] pool-1-thread-1:execute node id:52289e99-363d-4453-8077-ca8bdc6d35bf
[I]2022/07/27 21:23:19.008 [your flow id][38f3567d-77fb-4629-bf7e-68b27633ed68] pool-1-thread-1:execute node name:下單
下單開始 (模擬業務等待3秒)
下單結束
[I]2022/07/27 21:23:22.014 [your flow id][38f3567d-77fb-4629-bf7e-68b27633ed68] pool-1-thread-1:execute node id:16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2
[I]2022/07/27 21:23:22.014 [your flow id][38f3567d-77fb-4629-bf7e-68b27633ed68] pool-1-thread-1:execute node name:下單成功
下單成功開始 (模擬業務等待3秒)
下單成功結束
[I]2022/07/27 21:23:25.025 [your flow id][38f3567d-77fb-4629-bf7e-68b27633ed68] Thread-1:Complete success.
[I]2022/07/27 21:23:25.027 [your flow id][38f3567d-77fb-4629-bf7e-68b27633ed68] Thread-1:json:
{"nodes":[{"id": "1","label": "start" ,"color": "#36AE7C"},{"id": "a1a38c2e-0e05-4c68-bd49-f12aea070876","label": "查詢用戶信息" ,"color": "#36AE7C"},{"id": "1a90a997-4390-470a-ae7c-626a725438d2","label": "查詢酒店信息" ,"color": "#36AE7C"},{"id": "52289e99-363d-4453-8077-ca8bdc6d35bf","label": "下單" ,"color": "#36AE7C"},{"id": "16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2","label": "下單成功" ,"color": "#36AE7C"}],"edges":[{"id": "1","from": "1","to": "2","arrows": "to"},{"id": "b3ad7ab3-8fb6-4527-8cae-6845e03da3e4","from": "1","to": "a1a38c2e-0e05-4c68-bd49-f12aea070876","arrows": "to"},{"id": "001375c7-19e7-436b-bbcd-68e36c8f23b7","from": "1","to": "1a90a997-4390-470a-ae7c-626a725438d2","arrows": "to"},{"id": "dd830043-c7a7-4c71-b91c-10c007b7b19c","from": "1a90a997-4390-470a-ae7c-626a725438d2","to": "52289e99-363d-4453-8077-ca8bdc6d35bf","arrows": "to"},{"id": "21c2c69d-0050-4eca-8283-5a2bcbdc6c37","from": "52289e99-363d-4453-8077-ca8bdc6d35bf","to": "16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2","arrows": "to"},{"id": "19f2f329-8163-4dc6-a353-800df79d18a6","from": "a1a38c2e-0e05-4c68-bd49-f12aea070876","to": "52289e99-363d-4453-8077-ca8bdc6d35bf","arrows": "to"}]}
success
[I]2022/07/27 21:23:25.028  main:Ready queue thread stoped.
[I]2022/07/27 21:23:25.028  main:Ready queue thread stoped.
[I]2022/07/27 21:23:25.028  main:NodePool stoped.

將流程運行結束的json字符串拷貝到下面,然後點擊[show network]按鈕,可以顯示出流程執行後的狀態

綠色:執行成功,紅色:執行失敗,白色:未執行

帶分支處理的酒店預定流程

ladybugflow提供了對流程圖的分支處理功能。

可以根據節點的返回結果,執行不同的流程。

比如,上例中,增加【檢查訂單】節點,如下

 

 

檢查訂單成功,則走酒店預定流程,否則,走失敗流程。

針對以上流程,我們對檢查訂單的兩個邊設置返回值,如下:

生成的Json文件如下

Flow2.json(注意文件編碼為UTF-8)

{
	"flowId": "your flow id",
	"nodes": [
		{
			"id": "1",
			"label": "start"
		},
		{
			"id": "a1a38c2e-0e05-4c68-bd49-f12aea070876",
			"label": "查詢用戶信息",
			"readyCheck": 0
		},
		{
			"id": "1a90a997-4390-470a-ae7c-626a725438d2",
			"label": "查詢酒店信息",
			"readyCheck": 0
		},
		{
			"id": "52289e99-363d-4453-8077-ca8bdc6d35bf",
			"label": "下單",
			"readyCheck": 0
		},
		{
			"id": "16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2",
			"label": "下單成功",
			"readyCheck": 0
		},
		{
			"id": "5a1068c1-e365-4a51-b617-8cc093ce5e3d",
			"label": "檢查訂單",
			"readyCheck": 0
		},
		{
			"id": "0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10",
			"label": "可以預定",
			"readyCheck": 0
		},
		{
			"id": "7e841bf6-b422-4c2c-b4ec-d2352e22cc88",
			"label": "不可預定",
			"readyCheck": 0
		},
		{
			"id": "8fc59321-8b96-4e17-9d8e-0c8f5fe9c45e",
			"label": "失敗處理",
			"readyCheck": 0
		}
	],
	"edges": [
		{
			"id": "1",
			"from": "1",
			"to": "2",
			"arrows": "to"
		},
		{
			"id": "b3ad7ab3-8fb6-4527-8cae-6845e03da3e4",
			"from": "0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10",
			"to": "a1a38c2e-0e05-4c68-bd49-f12aea070876",
			"arrows": "to"
		},
		{
			"id": "001375c7-19e7-436b-bbcd-68e36c8f23b7",
			"from": "5a1068c1-e365-4a51-b617-8cc093ce5e3d",
			"to": "0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10",
			"condition": "1",
			"arrows": "to"
		},
		{
			"id": "dd830043-c7a7-4c71-b91c-10c007b7b19c",
			"from": "1a90a997-4390-470a-ae7c-626a725438d2",
			"to": "52289e99-363d-4453-8077-ca8bdc6d35bf",
			"arrows": "to"
		},
		{
			"id": "21c2c69d-0050-4eca-8283-5a2bcbdc6c37",
			"from": "52289e99-363d-4453-8077-ca8bdc6d35bf",
			"to": "16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2",
			"arrows": "to"
		},
		{
			"id": "19f2f329-8163-4dc6-a353-800df79d18a6",
			"from": "a1a38c2e-0e05-4c68-bd49-f12aea070876",
			"to": "52289e99-363d-4453-8077-ca8bdc6d35bf",
			"arrows": "to"
		},
		{
			"id": "822e5c76-ce59-4962-b5e3-a3dfd905fa05",
			"from": "1",
			"to": "5a1068c1-e365-4a51-b617-8cc093ce5e3d",
			"arrows": "to"
		},
		{
			"id": "36d6e697-b835-4374-9fa7-c1cd24b100e9",
			"from": "5a1068c1-e365-4a51-b617-8cc093ce5e3d",
			"to": "7e841bf6-b422-4c2c-b4ec-d2352e22cc88",
			"condition": "0",
			"arrows": "to"
		},
		{
			"id": "d4a03a18-2a24-4bec-9717-a82c8a4a764b",
			"from": "0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10",
			"to": "1a90a997-4390-470a-ae7c-626a725438d2",
			"arrows": "to"
		},
		{
			"id": "673051d5-27f5-4578-8fc2-4f5e7352d5d2",
			"from": "7e841bf6-b422-4c2c-b4ec-d2352e22cc88",
			"to": "8fc59321-8b96-4e17-9d8e-0c8f5fe9c45e",
			"arrows": "to"
		}
	]
}

業務方法中增加酒店檢查節點,這裡返回1,走檢查成功的流程。

Flow2.java(注意文件編碼為UTF-8)

/**
 * 
 * @author NoBugLady
 *
 */
public class Flow2 extends FlowRunner {

	private String result;
	
	public String getResult() {
		return result;
	}
	
	@Node(label = "start")
	public void processStart() throws InterruptedException {
		System.out.println("啟動開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("啟動結束");
	}

	@Node(label = "檢查訂單")
	public int processCheckOrder() throws InterruptedException {
		System.out.println("檢查訂單開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("檢查訂單結束");
		return 1;
	}

	@Node(label = "可以預定")
	public void processCheckOrderOK() throws InterruptedException {
		System.out.println("可以預定開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("可以預定結束");
	}

	@Node(label = "不可預訂")
	public void processCheckOrderNG() throws InterruptedException {
		System.out.println("不可預訂開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("不可預訂結束");
	}
	
	@Node(label = "查詢用戶信息")
	public void processSearchUser() throws InterruptedException {
		System.out.println("查詢用戶信息開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("查詢用戶信息結束");
	}

	@Node(label = "查詢酒店信息")
	public void processSearchHotel() throws InterruptedException {
		System.out.println("查詢酒店信息開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("查詢酒店信息結束");
	}

	@Node(label = "下單")
	public void processOrder() throws InterruptedException {
		System.out.println("下單開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("下單結束");
	}

	@Node(label = "下單成功")
	public void processSuccess() throws InterruptedException {
		System.out.println("下單成功開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("下單成功結束");
		result = "success";
	}

	@Node(label = "失敗處理")
	public void processError() throws InterruptedException {
		System.out.println("失敗處理開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("失敗處理結束");
		result = "error";
	}
}

啟動流程

App2.java(注意文件編碼為UTF-8)

/**
 * 
 * @author NoBugLady
 *
 */
public class App2 {

	public static void main(String[] args) {
		
		Flow2 testFlow = new Flow2();
		testFlow.startFlow(true);
		
		System.out.println(testFlow.getResult());

		// 不建議每次都調用shutdown,可以在整個App關閉的時候調用一次shutdown
		FlowStarter.shutdown();
		
	}
}

查看運行結果

[I]2022/07/27 21:29:56.046  main:ladybugflow.properties in root path not found, use default configuration
[I]2022/07/27 21:29:56.052  main:NodePool started.
[I]2022/07/27 21:29:56.052  main:Ready queue consumer thread started.
[I]2022/07/27 21:29:56.054  main:Complete queue consumer thread started.
[I]2022/07/27 21:29:56.927 [your flow id][73a425a8-2f13-42bc-9358-111d10378204] main:json:
{"flowId":"your flow id","nodes":[{"id":"1","label":"start","readyCheck":0},{"id":"a1a38c2e-0e05-4c68-bd49-f12aea070876","label":"查詢用戶信息","readyCheck":0},{"id":"1a90a997-4390-470a-ae7c-626a725438d2","label":"查詢酒店信息","readyCheck":0},{"id":"52289e99-363d-4453-8077-ca8bdc6d35bf","label":"下單","readyCheck":0},{"id":"16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2","label":"下單成功","readyCheck":0},{"id":"5a1068c1-e365-4a51-b617-8cc093ce5e3d","label":"檢查訂單","readyCheck":0},{"id":"0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10","label":"可以預定","readyCheck":0},{"id":"7e841bf6-b422-4c2c-b4ec-d2352e22cc88","label":"不可預定","readyCheck":0},{"id":"8fc59321-8b96-4e17-9d8e-0c8f5fe9c45e","label":"失敗處理","readyCheck":0}],"edges":[{"id":"1","from":"1","to":"2","condition":null,"arrows":"to"},{"id":"b3ad7ab3-8fb6-4527-8cae-6845e03da3e4","from":"0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10","to":"a1a38c2e-0e05-4c68-bd49-f12aea070876","condition":null,"arrows":"to"},{"id":"001375c7-19e7-436b-bbcd-68e36c8f23b7","from":"5a1068c1-e365-4a51-b617-8cc093ce5e3d","to":"0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10","condition":"1","arrows":"to"},{"id":"dd830043-c7a7-4c71-b91c-10c007b7b19c","from":"1a90a997-4390-470a-ae7c-626a725438d2","to":"52289e99-363d-4453-8077-ca8bdc6d35bf","condition":null,"arrows":"to"},{"id":"21c2c69d-0050-4eca-8283-5a2bcbdc6c37","from":"52289e99-363d-4453-8077-ca8bdc6d35bf","to":"16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2","condition":null,"arrows":"to"},{"id":"19f2f329-8163-4dc6-a353-800df79d18a6","from":"a1a38c2e-0e05-4c68-bd49-f12aea070876","to":"52289e99-363d-4453-8077-ca8bdc6d35bf","condition":null,"arrows":"to"},{"id":"822e5c76-ce59-4962-b5e3-a3dfd905fa05","from":"1","to":"5a1068c1-e365-4a51-b617-8cc093ce5e3d","condition":null,"arrows":"to"},{"id":"36d6e697-b835-4374-9fa7-c1cd24b100e9","from":"5a1068c1-e365-4a51-b617-8cc093ce5e3d","to":"7e841bf6-b422-4c2c-b4ec-d2352e22cc88","condition":"0","arrows":"to"},{"id":"d4a03a18-2a24-4bec-9717-a82c8a4a764b","from":"0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10","to":"1a90a997-4390-470a-ae7c-626a725438d2","condition":null,"arrows":"to"},{"id":"673051d5-27f5-4578-8fc2-4f5e7352d5d2","from":"7e841bf6-b422-4c2c-b4ec-d2352e22cc88","to":"8fc59321-8b96-4e17-9d8e-0c8f5fe9c45e","condition":null,"arrows":"to"}]}
[I]2022/07/27 21:29:56.931 [your flow id][73a425a8-2f13-42bc-9358-111d10378204] pool-1-thread-1:execute node id:1
[I]2022/07/27 21:29:56.931 [your flow id][73a425a8-2f13-42bc-9358-111d10378204] pool-1-thread-1:execute node name:start
啟動開始 (模擬業務等待3秒)
啟動結束
[I]2022/07/27 21:29:59.939 [your flow id][73a425a8-2f13-42bc-9358-111d10378204] pool-1-thread-1:execute node id:5a1068c1-e365-4a51-b617-8cc093ce5e3d
[I]2022/07/27 21:29:59.939 [your flow id][73a425a8-2f13-42bc-9358-111d10378204] pool-1-thread-1:execute node name:檢查訂單
檢查訂單開始 (模擬業務等待3秒)
檢查訂單結束
[I]2022/07/27 21:30:02.942 [your flow id][73a425a8-2f13-42bc-9358-111d10378204] pool-1-thread-1:execute node id:0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10
[I]2022/07/27 21:30:02.942 [your flow id][73a425a8-2f13-42bc-9358-111d10378204] pool-1-thread-1:execute node name:可以預定
可以預定開始 (模擬業務等待3秒)
可以預定結束
[I]2022/07/27 21:30:05.950 [your flow id][73a425a8-2f13-42bc-9358-111d10378204] pool-1-thread-1:execute node id:a1a38c2e-0e05-4c68-bd49-f12aea070876
[I]2022/07/27 21:30:05.950 [your flow id][73a425a8-2f13-42bc-9358-111d10378204] pool-1-thread-1:execute node name:查詢用戶信息
查詢用戶信息開始 (模擬業務等待3秒)
[I]2022/07/27 21:30:05.951 [your flow id][73a425a8-2f13-42bc-9358-111d10378204] pool-1-thread-2:execute node id:1a90a997-4390-470a-ae7c-626a725438d2
[I]2022/07/27 21:30:05.951 [your flow id][73a425a8-2f13-42bc-9358-111d10378204] pool-1-thread-2:execute node name:查詢酒店信息
查詢酒店信息開始 (模擬業務等待3秒)
查詢酒店信息結束
查詢用戶信息結束
[I]2022/07/27 21:30:08.956 [your flow id][73a425a8-2f13-42bc-9358-111d10378204] pool-1-thread-1:execute node id:52289e99-363d-4453-8077-ca8bdc6d35bf
[I]2022/07/27 21:30:08.956 [your flow id][73a425a8-2f13-42bc-9358-111d10378204] pool-1-thread-1:execute node name:下單
下單開始 (模擬業務等待3秒)
下單結束
[I]2022/07/27 21:30:11.960 [your flow id][73a425a8-2f13-42bc-9358-111d10378204] pool-1-thread-1:execute node id:16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2
[I]2022/07/27 21:30:11.960 [your flow id][73a425a8-2f13-42bc-9358-111d10378204] pool-1-thread-1:execute node name:下單成功
下單成功開始 (模擬業務等待3秒)
下單成功結束
[I]2022/07/27 21:30:14.975 [your flow id][73a425a8-2f13-42bc-9358-111d10378204] Thread-1:Complete success.
[I]2022/07/27 21:30:14.977 [your flow id][73a425a8-2f13-42bc-9358-111d10378204] Thread-1:json:
{"nodes":[{"id": "1","label": "start" ,"color": "#36AE7C"},{"id": "a1a38c2e-0e05-4c68-bd49-f12aea070876","label": "查詢用戶信息" ,"color": "#36AE7C"},{"id": "1a90a997-4390-470a-ae7c-626a725438d2","label": "查詢酒店信息" ,"color": "#36AE7C"},{"id": "52289e99-363d-4453-8077-ca8bdc6d35bf","label": "下單" ,"color": "#36AE7C"},{"id": "16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2","label": "下單成功" ,"color": "#36AE7C"},{"id": "5a1068c1-e365-4a51-b617-8cc093ce5e3d","label": "檢查訂單" ,"color": "#36AE7C"},{"id": "0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10","label": "可以預定" ,"color": "#36AE7C"},{"id": "7e841bf6-b422-4c2c-b4ec-d2352e22cc88","label": "不可預定" ,"color": "#E8F9FD"},{"id": "8fc59321-8b96-4e17-9d8e-0c8f5fe9c45e","label": "失敗處理" ,"color": "#E8F9FD"}],"edges":[{"id": "1","from": "1","to": "2","arrows": "to"},{"id": "b3ad7ab3-8fb6-4527-8cae-6845e03da3e4","from": "0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10","to": "a1a38c2e-0e05-4c68-bd49-f12aea070876","arrows": "to"},{"id": "001375c7-19e7-436b-bbcd-68e36c8f23b7","from": "5a1068c1-e365-4a51-b617-8cc093ce5e3d","to": "0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10","arrows": "to"},{"id": "dd830043-c7a7-4c71-b91c-10c007b7b19c","from": "1a90a997-4390-470a-ae7c-626a725438d2","to": "52289e99-363d-4453-8077-ca8bdc6d35bf","arrows": "to"},{"id": "21c2c69d-0050-4eca-8283-5a2bcbdc6c37","from": "52289e99-363d-4453-8077-ca8bdc6d35bf","to": "16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2","arrows": "to"},{"id": "19f2f329-8163-4dc6-a353-800df79d18a6","from": "a1a38c2e-0e05-4c68-bd49-f12aea070876","to": "52289e99-363d-4453-8077-ca8bdc6d35bf","arrows": "to"},{"id": "822e5c76-ce59-4962-b5e3-a3dfd905fa05","from": "1","to": "5a1068c1-e365-4a51-b617-8cc093ce5e3d","arrows": "to"},{"id": "36d6e697-b835-4374-9fa7-c1cd24b100e9","from": "5a1068c1-e365-4a51-b617-8cc093ce5e3d","to": "7e841bf6-b422-4c2c-b4ec-d2352e22cc88","arrows": "to"},{"id": "d4a03a18-2a24-4bec-9717-a82c8a4a764b","from": "0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10","to": "1a90a997-4390-470a-ae7c-626a725438d2","arrows": "to"},{"id": "673051d5-27f5-4578-8fc2-4f5e7352d5d2","from": "7e841bf6-b422-4c2c-b4ec-d2352e22cc88","to": "8fc59321-8b96-4e17-9d8e-0c8f5fe9c45e","arrows": "to"}]}
success
[I]2022/07/27 21:30:14.977  main:Ready queue thread stoped.
[I]2022/07/27 21:30:14.977  main:Ready queue thread stoped.
[I]2022/07/27 21:30:14.977  main:NodePool stoped.

將流程運行結束的json字符串拷貝到下面,然後點擊[show network]按鈕,可以顯示出流程執行後的狀態

綠色:執行成功,紅色:執行失敗,白色:未執行

去除不必要的業務節點

實際使用過程中,並非每個業務節點都需要對應業務代碼,

比如上例中【可以預定】和【不可預定】可以沒有相應的業務邏輯,空跑一下轉到後面的節點即可。

所以,我們可以在業務邏輯中去掉上述節點,如下,去掉了【可以預定】和【不可預定】對應的業務方法。

Flow3.java(注意文件編碼為UTF-8)


/**
 * 
 * @author NoBugLady
 *
 */
public class Flow3 extends FlowRunner {

	private String result;
	
	public String getResult() {
		return result;
	}
	
	@Node(label = "start")
	public void processStart() throws InterruptedException {
		System.out.println("啟動開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("啟動結束");
	}

	@Node(label = "檢查訂單")
	public int processCheckOrder() throws InterruptedException {
		System.out.println("檢查訂單開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("檢查訂單結束");
		return 1;
	}

	@Node(label = "查詢用戶信息")
	public void processSearchUser() throws InterruptedException {
		System.out.println("查詢用戶信息開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("查詢用戶信息結束");
	}

	@Node(label = "查詢酒店信息")
	public void processSearchHotel() throws InterruptedException {
		System.out.println("查詢酒店信息開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("查詢酒店信息結束");
	}

	@Node(label = "下單")
	public void processOrder() throws InterruptedException {
		System.out.println("下單開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("下單結束");
	}

	@Node(label = "下單成功")
	public void processSuccess() throws InterruptedException {
		System.out.println("下單成功開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("下單成功結束");
		result = "success";
	}

	@Node(label = "失敗處理")
	public void processError() throws InterruptedException {
		System.out.println("失敗處理開始 (模擬業務等待3秒)");
		Thread.sleep(3000);
		System.out.println("失敗處理結束");
		result = "error";
	}
}

啟動代碼和流程配置文件不變

App3.java(注意文件編碼為UTF-8)

/**
 * 
 * @author NoBugLady
 *
 */
public class App3 {

	public static void main(String[] args) {
		
		Flow3 testFlow = new Flow3();
		testFlow.startFlow(true);
		
		System.out.println(testFlow.getResult());
        
		// 不建議每次都調用shutdown,可以在整個App關閉的時候調用一次shutdown
		FlowStarter.shutdown();
		
	}
}

Flow3.json(注意文件編碼為UTF-8)

{
	"flowId": "your flow id",
	"nodes": [
		{
			"id": "1",
			"label": "start"
		},
		{
			"id": "a1a38c2e-0e05-4c68-bd49-f12aea070876",
			"label": "查詢用戶信息",
			"readyCheck": 0
		},
		{
			"id": "1a90a997-4390-470a-ae7c-626a725438d2",
			"label": "查詢酒店信息",
			"readyCheck": 0
		},
		{
			"id": "52289e99-363d-4453-8077-ca8bdc6d35bf",
			"label": "下單",
			"readyCheck": 0
		},
		{
			"id": "16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2",
			"label": "下單成功",
			"readyCheck": 0
		},
		{
			"id": "5a1068c1-e365-4a51-b617-8cc093ce5e3d",
			"label": "檢查訂單",
			"readyCheck": 0
		},
		{
			"id": "0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10",
			"label": "可以預定",
			"readyCheck": 0
		},
		{
			"id": "7e841bf6-b422-4c2c-b4ec-d2352e22cc88",
			"label": "不可預定",
			"readyCheck": 0
		},
		{
			"id": "8fc59321-8b96-4e17-9d8e-0c8f5fe9c45e",
			"label": "失敗處理",
			"readyCheck": 0
		}
	],
	"edges": [
		{
			"id": "1",
			"from": "1",
			"to": "2",
			"arrows": "to"
		},
		{
			"id": "b3ad7ab3-8fb6-4527-8cae-6845e03da3e4",
			"from": "0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10",
			"to": "a1a38c2e-0e05-4c68-bd49-f12aea070876",
			"arrows": "to"
		},
		{
			"id": "001375c7-19e7-436b-bbcd-68e36c8f23b7",
			"from": "5a1068c1-e365-4a51-b617-8cc093ce5e3d",
			"to": "0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10",
			"condition": "1",
			"arrows": "to"
		},
		{
			"id": "dd830043-c7a7-4c71-b91c-10c007b7b19c",
			"from": "1a90a997-4390-470a-ae7c-626a725438d2",
			"to": "52289e99-363d-4453-8077-ca8bdc6d35bf",
			"arrows": "to"
		},
		{
			"id": "21c2c69d-0050-4eca-8283-5a2bcbdc6c37",
			"from": "52289e99-363d-4453-8077-ca8bdc6d35bf",
			"to": "16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2",
			"arrows": "to"
		},
		{
			"id": "19f2f329-8163-4dc6-a353-800df79d18a6",
			"from": "a1a38c2e-0e05-4c68-bd49-f12aea070876",
			"to": "52289e99-363d-4453-8077-ca8bdc6d35bf",
			"arrows": "to"
		},
		{
			"id": "822e5c76-ce59-4962-b5e3-a3dfd905fa05",
			"from": "1",
			"to": "5a1068c1-e365-4a51-b617-8cc093ce5e3d",
			"arrows": "to"
		},
		{
			"id": "36d6e697-b835-4374-9fa7-c1cd24b100e9",
			"from": "5a1068c1-e365-4a51-b617-8cc093ce5e3d",
			"to": "7e841bf6-b422-4c2c-b4ec-d2352e22cc88",
			"condition": "0",
			"arrows": "to"
		},
		{
			"id": "d4a03a18-2a24-4bec-9717-a82c8a4a764b",
			"from": "0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10",
			"to": "1a90a997-4390-470a-ae7c-626a725438d2",
			"arrows": "to"
		},
		{
			"id": "673051d5-27f5-4578-8fc2-4f5e7352d5d2",
			"from": "7e841bf6-b422-4c2c-b4ec-d2352e22cc88",
			"to": "8fc59321-8b96-4e17-9d8e-0c8f5fe9c45e",
			"arrows": "to"
		}
	]
}

運行結果

[I]2022/07/27 21:34:29.548  main:ladybugflow.properties in root path not found, use default configuration
[I]2022/07/27 21:34:29.558  main:NodePool started.
[I]2022/07/27 21:34:29.560  main:Ready queue consumer thread started.
[I]2022/07/27 21:34:29.563  main:Complete queue consumer thread started.
[I]2022/07/27 21:34:30.494 [your flow id][970f3310-4ca1-41db-9348-bcc3fe994ce5] main:json:
{"flowId":"your flow id","nodes":[{"id":"1","label":"start","readyCheck":0},{"id":"a1a38c2e-0e05-4c68-bd49-f12aea070876","label":"查詢用戶信息","readyCheck":0},{"id":"1a90a997-4390-470a-ae7c-626a725438d2","label":"查詢酒店信息","readyCheck":0},{"id":"52289e99-363d-4453-8077-ca8bdc6d35bf","label":"下單","readyCheck":0},{"id":"16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2","label":"下單成功","readyCheck":0},{"id":"5a1068c1-e365-4a51-b617-8cc093ce5e3d","label":"檢查訂單","readyCheck":0},{"id":"0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10","label":"可以預定","readyCheck":0},{"id":"7e841bf6-b422-4c2c-b4ec-d2352e22cc88","label":"不可預定","readyCheck":0},{"id":"8fc59321-8b96-4e17-9d8e-0c8f5fe9c45e","label":"失敗處理","readyCheck":0}],"edges":[{"id":"1","from":"1","to":"2","condition":null,"arrows":"to"},{"id":"b3ad7ab3-8fb6-4527-8cae-6845e03da3e4","from":"0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10","to":"a1a38c2e-0e05-4c68-bd49-f12aea070876","condition":null,"arrows":"to"},{"id":"001375c7-19e7-436b-bbcd-68e36c8f23b7","from":"5a1068c1-e365-4a51-b617-8cc093ce5e3d","to":"0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10","condition":"1","arrows":"to"},{"id":"dd830043-c7a7-4c71-b91c-10c007b7b19c","from":"1a90a997-4390-470a-ae7c-626a725438d2","to":"52289e99-363d-4453-8077-ca8bdc6d35bf","condition":null,"arrows":"to"},{"id":"21c2c69d-0050-4eca-8283-5a2bcbdc6c37","from":"52289e99-363d-4453-8077-ca8bdc6d35bf","to":"16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2","condition":null,"arrows":"to"},{"id":"19f2f329-8163-4dc6-a353-800df79d18a6","from":"a1a38c2e-0e05-4c68-bd49-f12aea070876","to":"52289e99-363d-4453-8077-ca8bdc6d35bf","condition":null,"arrows":"to"},{"id":"822e5c76-ce59-4962-b5e3-a3dfd905fa05","from":"1","to":"5a1068c1-e365-4a51-b617-8cc093ce5e3d","condition":null,"arrows":"to"},{"id":"36d6e697-b835-4374-9fa7-c1cd24b100e9","from":"5a1068c1-e365-4a51-b617-8cc093ce5e3d","to":"7e841bf6-b422-4c2c-b4ec-d2352e22cc88","condition":"0","arrows":"to"},{"id":"d4a03a18-2a24-4bec-9717-a82c8a4a764b","from":"0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10","to":"1a90a997-4390-470a-ae7c-626a725438d2","condition":null,"arrows":"to"},{"id":"673051d5-27f5-4578-8fc2-4f5e7352d5d2","from":"7e841bf6-b422-4c2c-b4ec-d2352e22cc88","to":"8fc59321-8b96-4e17-9d8e-0c8f5fe9c45e","condition":null,"arrows":"to"}]}
[I]2022/07/27 21:34:30.497 [your flow id][970f3310-4ca1-41db-9348-bcc3fe994ce5] pool-1-thread-1:execute node id:1
[I]2022/07/27 21:34:30.498 [your flow id][970f3310-4ca1-41db-9348-bcc3fe994ce5] pool-1-thread-1:execute node name:start
啟動開始 (模擬業務等待3秒)
啟動結束
[I]2022/07/27 21:34:33.502 [your flow id][970f3310-4ca1-41db-9348-bcc3fe994ce5] pool-1-thread-1:execute node id:5a1068c1-e365-4a51-b617-8cc093ce5e3d
[I]2022/07/27 21:34:33.503 [your flow id][970f3310-4ca1-41db-9348-bcc3fe994ce5] pool-1-thread-1:execute node name:檢查訂單
檢查訂單開始 (模擬業務等待3秒)
檢查訂單結束
[I]2022/07/27 21:34:36.518 [your flow id][970f3310-4ca1-41db-9348-bcc3fe994ce5] pool-1-thread-1:execute node id:0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10
[I]2022/07/27 21:34:36.518 [your flow id][970f3310-4ca1-41db-9348-bcc3fe994ce5] pool-1-thread-1:execute node name:可以預定
[I]2022/07/27 21:34:36.519 [your flow id][970f3310-4ca1-41db-9348-bcc3fe994ce5] pool-1-thread-1:execute node id:a1a38c2e-0e05-4c68-bd49-f12aea070876
[I]2022/07/27 21:34:36.519 [your flow id][970f3310-4ca1-41db-9348-bcc3fe994ce5] pool-1-thread-1:execute node name:查詢用戶信息
查詢用戶信息開始 (模擬業務等待3秒)
[I]2022/07/27 21:34:36.519 [your flow id][970f3310-4ca1-41db-9348-bcc3fe994ce5] pool-1-thread-2:execute node id:1a90a997-4390-470a-ae7c-626a725438d2
[I]2022/07/27 21:34:36.519 [your flow id][970f3310-4ca1-41db-9348-bcc3fe994ce5] pool-1-thread-2:execute node name:查詢酒店信息
查詢酒店信息開始 (模擬業務等待3秒)
查詢用戶信息結束
查詢酒店信息結束
[I]2022/07/27 21:34:39.522 [your flow id][970f3310-4ca1-41db-9348-bcc3fe994ce5] pool-1-thread-2:execute node id:52289e99-363d-4453-8077-ca8bdc6d35bf
[I]2022/07/27 21:34:39.522 [your flow id][970f3310-4ca1-41db-9348-bcc3fe994ce5] pool-1-thread-2:execute node name:下單
下單開始 (模擬業務等待3秒)
下單結束
[I]2022/07/27 21:34:42.529 [your flow id][970f3310-4ca1-41db-9348-bcc3fe994ce5] pool-1-thread-2:execute node id:16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2
[I]2022/07/27 21:34:42.529 [your flow id][970f3310-4ca1-41db-9348-bcc3fe994ce5] pool-1-thread-2:execute node name:下單成功
下單成功開始 (模擬業務等待3秒)
下單成功結束
[I]2022/07/27 21:34:45.530 [your flow id][970f3310-4ca1-41db-9348-bcc3fe994ce5] Thread-1:Complete success.
[I]2022/07/27 21:34:45.532 [your flow id][970f3310-4ca1-41db-9348-bcc3fe994ce5] Thread-1:json:
{"nodes":[{"id": "1","label": "start" ,"color": "#36AE7C"},{"id": "a1a38c2e-0e05-4c68-bd49-f12aea070876","label": "查詢用戶信息" ,"color": "#36AE7C"},{"id": "1a90a997-4390-470a-ae7c-626a725438d2","label": "查詢酒店信息" ,"color": "#36AE7C"},{"id": "52289e99-363d-4453-8077-ca8bdc6d35bf","label": "下單" ,"color": "#36AE7C"},{"id": "16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2","label": "下單成功" ,"color": "#36AE7C"},{"id": "5a1068c1-e365-4a51-b617-8cc093ce5e3d","label": "檢查訂單" ,"color": "#36AE7C"},{"id": "0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10","label": "可以預定" ,"color": "#36AE7C"},{"id": "7e841bf6-b422-4c2c-b4ec-d2352e22cc88","label": "不可預定" ,"color": "#E8F9FD"},{"id": "8fc59321-8b96-4e17-9d8e-0c8f5fe9c45e","label": "失敗處理" ,"color": "#E8F9FD"}],"edges":[{"id": "1","from": "1","to": "2","arrows": "to"},{"id": "b3ad7ab3-8fb6-4527-8cae-6845e03da3e4","from": "0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10","to": "a1a38c2e-0e05-4c68-bd49-f12aea070876","arrows": "to"},{"id": "001375c7-19e7-436b-bbcd-68e36c8f23b7","from": "5a1068c1-e365-4a51-b617-8cc093ce5e3d","to": "0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10","arrows": "to"},{"id": "dd830043-c7a7-4c71-b91c-10c007b7b19c","from": "1a90a997-4390-470a-ae7c-626a725438d2","to": "52289e99-363d-4453-8077-ca8bdc6d35bf","arrows": "to"},{"id": "21c2c69d-0050-4eca-8283-5a2bcbdc6c37","from": "52289e99-363d-4453-8077-ca8bdc6d35bf","to": "16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2","arrows": "to"},{"id": "19f2f329-8163-4dc6-a353-800df79d18a6","from": "a1a38c2e-0e05-4c68-bd49-f12aea070876","to": "52289e99-363d-4453-8077-ca8bdc6d35bf","arrows": "to"},{"id": "822e5c76-ce59-4962-b5e3-a3dfd905fa05","from": "1","to": "5a1068c1-e365-4a51-b617-8cc093ce5e3d","arrows": "to"},{"id": "36d6e697-b835-4374-9fa7-c1cd24b100e9","from": "5a1068c1-e365-4a51-b617-8cc093ce5e3d","to": "7e841bf6-b422-4c2c-b4ec-d2352e22cc88","arrows": "to"},{"id": "d4a03a18-2a24-4bec-9717-a82c8a4a764b","from": "0aa3e9de-4015-4db0-9eda-fd1cd0fbbf10","to": "1a90a997-4390-470a-ae7c-626a725438d2","arrows": "to"},{"id": "673051d5-27f5-4578-8fc2-4f5e7352d5d2","from": "7e841bf6-b422-4c2c-b4ec-d2352e22cc88","to": "8fc59321-8b96-4e17-9d8e-0c8f5fe9c45e","arrows": "to"}]}
success
[I]2022/07/27 21:34:45.532  main:Ready queue thread stoped.
[I]2022/07/27 21:34:45.532  main:Ready queue thread stoped.
[I]2022/07/27 21:34:45.533  main:NodePool stoped.

將流程運行結束的json字符串拷貝到下面,然後點擊[show network]按鈕,可以顯示出流程執行後的狀態

綠色:執行成功,紅色:執行失敗,白色:未執行

感謝您讀文章到這裡。

最後

設計資料和詳細的使用方法可以參照上一篇文章://www.cnblogs.com/nobuglady/p/16474433.html

源碼://github.com/nobuglady/ladybugflow

運行例源碼://github.com/nobuglady/ladybugflow-demo