設計 乙個簡單的 流程引擎

2022-01-12 08:01:14 字數 2529 閱讀 6998

專案原因:

之前參與過一些 工作流 的專案,都是基於 某些 機構現有的 工作流引擎。

專案進行中,最鬧心的 莫過於 業務** 和 流程** 的 混淆一起。

見過的工作流是怎樣的:

>首先乙個基於 silverlight 的 流程ui設計器; 通過設計器 得到乙個 流程xml 和 布局json 兩個檔案(布局json檔案當然對 後期執行是 沒有用的);

>業務單據 填寫資訊,點選「儲存」,執行:儲存單據資料,從 流程引擎 讀取 xml 得到 流程物件,設定下一步 跳轉 節點 n1,分發待辦;

>審批單據 填寫意見,點選「審批」,執行:修改單據狀態,從 流程引擎 讀取 xml 得到 流程物件,設定下一步 跳轉 節點 n2,分發待辦;

>審批單據 填寫意見,點選「駁回」,執行:修改單據狀態,從 流程引擎 讀取 xml 得到 流程物件,通過條件,設定下一步 跳轉 節點 n1  或者 n0 或者 nx,分發待辦;

於是,每乙個 單據 的 按鈕事件  都得 呼叫一串 工作流**,跳轉到 哪個流程 也是 ** 說了算。

於是,我開始質疑:流程設計器中 的 連線,連線上的判斷條件 莫非就是 裝飾?

不然,為什麼 跳轉 哪個節點,回退到哪個節點,條件判斷 都在 業務**中 完成的 —— 和 流程設計器 的 設計,除了  n1,n2,n0,nx 有關係之外,基本沒有啥 關係。

我希望的工作流是怎樣的:

>首先乙個 流程ui設計器,通過設計器 得到乙個 流程xml 和 布局檔案(反正也不參與後續,什麼格式無所謂);

>業務單據 填寫資訊,單擊「儲存」,執行:儲存單據資料,一行** 告訴 流程引擎:出庫審批 的 o20131015001  單據,啟動流程;

>審批單據 填寫意見,單擊「審批」,執行:修改單據狀態,一行**  告訴 流程引擎:出庫審批 的 o20131015001  單據,激發流程;

>審批單據 填寫意見,點選「駁回」,執行:修改單據狀態,一行**  告訴 流程引擎:出庫審批 的 o20131015001  單據,激發流程;

>於是,整個過程中:業務只需要 辦完自己需要辦的事情,然後通知 流程引擎 自己去分析流程 到了哪一步,自己分析下一步該怎麼辦;

打個比方:

1. 出庫人員 填寫乙個 單據,單據拿給 秘書;

2. 秘書拿給 經理,經理填寫 同意;

3. 秘書再拿給 老闆,老闆填寫 同意/駁回;

突發意外:老闆 人間蒸發了;

2. 秘書拿給 經理,經理填寫 同意;

於是下乙個環節就是錯誤,這個錯誤的處理有兩種:

>秘書直接對經理說:老闆沒了,沒有下一步審批人,您填寫的單據無法流轉,因為是同乙個事務,您的「同意」也是無效的;您如果寫 「不同意」,就不會有任何錯誤;

>秘書拿上經理同意的單據走了。然後她一分析:找不到老闆;她不好擅自做主,於是給公司所有管理層 發了 一封郵件:老闆不在,很多單據 無法審批,流程走不通;

秘書的處理方式,就像 我所看所想的 工作流引擎:

>前者,因為老闆沒了,經理的 同意 成了乙個錯誤;

>後者,經理 直接就同意了——他不用管 下一步 該誰審批,也不用管 錯誤時 他該怎麼做;

這個比方中,秘書 就扮演了 流程引擎 的作用:她負責將單據 按照她 知道的流程 走下去;出現錯誤,他會按照 制度 通知指定的管理層;

好的流程引擎,就像乙個好的秘書(前面 老闆蒸發,經理為難 的例子 可能不那麼 嚴重,下面 的例子呢?);

如果哪天,經理人間蒸發了,出庫人員 單據寫好了,客戶拖著 貨物 已經開車跑了;

>前者,秘書告訴 出庫人員:經理不在了,你的單據無法流轉,因為是同乙個事務,你的單據也是無效的;(單據可以填寫失敗,但是公司的貨物可是已經 拖走了的)

>後者,秘書收到 單據,她一分分析:找不到經理;她不好擅自做主,於是給公司所有管理層 發了 一封郵件:經理不在,很多單據 無法審批,流程走不通;

流程引擎:只應該負責流程的傳遞,而不是 破壞 具體資料和決策。

後期維護:

哪天,老闆娶了個 搞經融的 老婆;老闆審批之後,老婆想查閱(不是審批)一下財務;

業務** 和 流程** 混合的專案,除了修改 流程設計器 加節點 之外,還要 修改業務**:n2節點,老闆審批成功,則給老婆發一封郵件;

而 業務** 和 流程** 分離的專案,流程設計器 中 增加乙個 節點(執行外掛程式,傳送郵件,郵件接收人 從 xml 讀取);

程式結構圖:

最後的簡潔:

>不同型別的** 分離,永遠是 軟體設計 的 潮流趨勢:比方說 mvc框架,效能是比 webform 慢的,但是 因為實現了 **分離,減少的是後期 維護成本;

>流程引擎,只應該負責流程的傳遞,而不是因為流程的 錯誤 而 破壞 具體資料和決策;

乙個簡單的dao設計

最近把框架裡的資料庫連線池做好了,整個dao差不多也算完成了 因為懶,所以部分資料庫驅動還沒寫 整個dao由連線物件和解析驅動兩個部分組成,大概就是下面這個樣子 連線物件主要實現如下方法 解析器的作用是將操作狀態轉化為sql語句,主要實現以下功能 其中insert,update,query,dele...

乙個簡單API設計

用乙個紅綠燈來學習jsapi的設計 css trafficlight li trafficlight span trafficlight.stop li nth child 1 span trafficlight.wait li nth child 2 span trafficlight.pass ...

BPEL學習 建立乙個簡單的流程

客戶發出乙個貸款請求 請求得到處理,然後客戶弄清楚貸款是否得到了批准。一開始,中間那個步驟將包括向啟用 web 服務的金融機構傳送申請並將決定告訴客戶。從客戶的角度看,該流程將使用他的申請,然後給他傳送乙個應答。建立流程 上面的行為包括 獲得訊息 然後呼叫金融機構的 web 服務以及最後應答客戶。在...