業務可視化-讓你的流程圖”Run”起來(2.問題與改進)
- 2022 年 7 月 12 日
- 筆記
前言
首先,感謝大家對上一篇文章[業務可視化-讓你的流程圖”Run”起來]的支援。
分享一下近期我對這個項目的一些改進。
問題&改進
問題1:
流程運行開始後,非同步執行,無法同步等待流程運行結束。
改進方法:
修正後流程(黃色部分為修改點):
調用程式碼:
// 非同步調用(默認)
flow.start();
// 或者
flow.start(false);
// 同步調用
flow.start(true);
問題2:
工程需要自己下載編譯,無法自動引用。
改進方法:
將程式碼發布到maven倉庫,然後可以用下面的方法調用:
Maven
<!-- //mvnrepository.com/artifact/io.github.nobuglady/ladybugflow -->
<dependency>
<groupId>io.github.nobuglady</groupId>
<artifactId>ladybugflow</artifactId>
<version>0.0.1</version>
</dependency>
Gradle
// //mvnrepository.com/artifact/io.github.nobuglady/ladybugflow
implementation 'io.github.nobuglady:ladybugflow:0.0.1'
發布到maven倉庫遇到的坑:
1. 自動發布到maven倉庫後,無法release。
首先,在創建了maven倉庫的帳號,並且完成相關配置後,發布流程如下
a) 執行命令 mvn clean deploy
b) 登錄sonatype倉庫,選擇Staging Repository,將發布的工程選中,選擇close。
c) 登錄sonatype倉庫,選擇Staging Repository,將發布的工程選中,選擇release。
我遇到的問題:
步驟a)執行完畢正常結束後,在sonatype倉庫中,在Staging Repository中看不到自己的工程。
但是搜索自己的工程可以看到已經上傳的文件,也可以刪除(release狀態的文件應該不能刪除)。
所以判斷是沒有自動release,但也沒法手工release,也沒有任何錯誤提示。
解決方法:
本地打包,手工將bundle.jar上傳到Staging Repository,這樣可以看到中間狀態文件出的問題。
果然,在手工上傳成功後,自動運行的一些校驗提示了一些pom文件問題,這可能是導致之前沒有自動release的原因。
本地打包方法:
a) 執行
mvn release:clean release:prepare
b) 在target目錄會看到類似下面的文件
ladybugflow-0.0.2.jar
ladybugflow-0.0.2.jar.asc
ladybugflow-0.0.2.pom
ladybugflow-0.0.2.pom.asc
ladybugflow-0.0.2-javadoc.jar
ladybugflow-0.0.2-javadoc.jar.asc
ladybugflow-0.0.2-sources.jar
ladybugflow-0.0.2-sources.jar.asc
c)進入到target目錄,運行下面命令來打包
jar -cvf bundle.jar ladybugflow*
d)將打包好的jar文件手工上傳到sonatype倉庫
e)在sonatype倉庫等待自己上傳的文件到close狀態,檢查沒問題後,選擇release。
2. 提示 can not upload bundle Because is xxxx is a RELEASE repository
解決方法:
在pom.xm的版本號中加入-SNAPSHOT,比如
<project xmlns="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>io.github.nobuglady</groupId>
<artifactId>ladybugflow</artifactId>
<packaging>jar</packaging>
<version>0.0.2-SNAPSHOT</version>
<name>ladybugflow</name>
......
項目優點
優點,也是難點,但不是亮點。設計過程複雜(花了很長時間做改進),設計結果的話又極其簡單(光看結果甚至會認為這個設計花不了一天)。
這種流程圖設計的最大問題就是流程圖狀態的更新,比如等待前面的一個或多個節點運行結束後,啟動自身節點。
第一版:每個節點提交到執行緒池後留下Future句柄,存起來。
後續節點運行前檢查前面所有join到自己節點的Future句柄,是否完成。
可以阻塞檢查,也可以sleep循環檢查。
問題:
看似解決了問題,但隱患多多,比如所有的Future句柄都要存起來,那就涉及到這些東東的管理問題,想起來又興奮又頭大。
還有檢查的時候是阻塞檢查,還是sleep循環檢查,還是。。。還是給每個節點加一個計數器,計數器清零則觸發本節點執行。。。
改進:
將多執行緒轉化為單執行緒或者可控的幾個執行緒,把圖(流程圖)單獨管理。
簡單的說,是一個人(一個邏輯)單獨的只負責更新圖,根據每個節點的狀態更新圖。更新圖後,輸出後續要運行的節點給調用者。
這樣就將節點運行,流程圖狀態分開管理。更新圖的流程入口和出口分別對應兩個隊列:
入口:運行完畢的節點隊列
出口:將要運行的節點隊列
更新圖的流程監聽入口,得到一個消息(節點運行完畢)後,更新該節點對應的流程圖,然後將後續要運行的節點輸出給出口(將要運行的隊列)。
節點的運行邏輯監聽出口隊列,然後怎麼運行節點都可以了,在本地,在遠程,在雲端都無所謂,只要節點運行後告知入口隊列,自己運行完畢,
則流程圖會自動更新,並且往出口上發消息(後續要運行的節點),如下圖所示:
這樣設計的優點:
將多執行緒轉化為單執行緒或者有限的幾個執行緒處理,避免了高並發編程帶來的各種問題和風險。
可以自由對流程圖模組進行升級,比如每條邊加條件,根據條件進行更新,異常後對流程的更新,根據節點返回值進行更新,綁定動態邏輯等等,我可以專心的設計路程圖更新的方法,不用考慮節點運行的事情。實現了流程圖更新自由。
可以自由對節點運行模組進行升級,雲端運行,api調用運行,shell運行,本地運行,分散式集群運行等等,不用考慮流程圖怎麼更新的問題。實現了節點運行自由。
感謝您看文章讀到這裡。
最後
源碼://github.com/nobuglady/ladybugflow