[英]How would you implement a Workflow system?
我需要實施工作流系統。
例如,要導出一些數據,我需要:
我開始創建兩種類型class,Workflow,負責添加新的Step object並運行。
每個 Steps 實現一個 StepInterface。
我主要擔心的是我的所有步驟都依賴於前一個步驟(第一個步驟除外),我想知道處理此類問題的最佳方法是什么。
我雖然循環遍歷每個步驟並為每個步驟提供前一個步驟的結果(如果有的話),但我對此並不滿意。
另一個想法是允許將“上一個”步驟設置為一個步驟,例如:
$s = new Step();
$s->setPreviousStep(Step $step);
但是我失去了工作流 class 的效用。
任何想法,建議?
順便說一句,我也關心整個工作流程的成功或失敗,這意味着如果任何步驟失敗我需要回滾或清理以前的數據。
去年我實現了一個類似的工作流引擎(雖然是封閉源代碼——所以我沒有可以共享的代碼)。 以下是基於該經驗的一些想法:
您可能還需要考慮以下內容 - 如果您計划將其作為大規模服務/服務器實施:
回滾可以很容易地適應這個結構,因為每個Step
都將實現自己的rollback()
方法,如果任何步驟失敗,工作流可以調用(最好以相反的順序)。
至於主要問題,這實際上取決於您想要獲得的復雜程度。 在基本層面上,您可以定義一個StepResult
接口,它由每個步驟返回並傳遞給下一個步驟。 這種方法的明顯問題是每個步驟都應該“知道”期望StepResult
的哪個實現。 對於小型系統,這可能是可以接受的,對於大型系統,您可能需要某種可配置的映射框架,可以告知如何將上一步的結果轉換為下一步的輸入。 所以Workflow
將調用Step
, Step
返回StepResult
,然后Workflow
調用StepResultConverter
(這是您可配置的映射), StepResultConverter
返回一個StepInput
,然后Workflow
使用StepInput
調用下一個Step
等等。
我在使用有限的 state 機器實施工作流方面取得了巨大成功。 它可以像您喜歡的那樣簡單或復雜,多個工作流程相互鏈接。 通常,FSM 可以實現為一個簡單的表,其中給定 object 的當前 state 在歷史表中通過保留 object 上的轉換日志並簡單地檢索最后一個條目來跟蹤。 因此,過渡將采用以下形式:
nextState = TransLookup(currState, Event, [條件])
如果您正在實施前端,您可以使用此轉換信息來構建給定 object 在其當前 state 中可用的事件列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.