簡體   English   中英

您將如何實施工作流系統?

[英]How would you implement a Workflow system?

我需要實施工作流系統。

例如,要導出一些數據,我需要:

  1. 使用 XSLT 處理器轉換 XML 文件
  2. 使用生成的轉換轉換為任意數據結構
  3. 使用結果(文件或數據)並生成存檔
  4. 將存檔移動到給定的文件夾中。

我開始創建兩種類型class,Workflow,負責添加新的Step object並運行。

每個 Steps 實現一個 StepInterface。

我主要擔心的是我的所有步驟都依賴於前一個步驟(第一個步驟除外),我想知道處理此類問題的最佳方法是什么。

我雖然循環遍歷每個步驟並為每個步驟提供前一個步驟的結果(如果有的話),但我對此並不滿意。

另一個想法是允許將“上一個”步驟設置為一個步驟,例如:

$s = new Step();
$s->setPreviousStep(Step $step);

但是我失去了工作流 class 的效用。

任何想法,建議?

順便說一句,我也關心整個工作流程的成功或失敗,這意味着如果任何步驟失敗我需要回滾或清理以前的數據。

去年我實現了一個類似的工作流引擎(雖然是封閉源代碼——所以我沒有可以共享的代碼)。 以下是基於該經驗的一些想法:

  1. StepInterface - 可以做你現在正在做的事 - 抽象一個步驟。
  2. 此外,提供回滾功能,但我認為一個步驟應該知道它何時失敗並在進一步處理之前進行清理。 一個抽象步驟可以為你處理這個(模板方法)
  3. 您可能需要考慮基於 StepResult 的分支 - 這樣您就可以執行一個 StepMatcher,它采用 stepResult object 和一個條件 - 它的子步驟僅在條件返回 true 時執行。
  4. 如果某個步驟出錯,您還可以執行 StepException 來處理異常流程。 理想情況下,這是您可以在工作流級別(如果任何步驟失敗時執行此操作)和/或步驟級別定義的東西。
  5. 我采用的方法是,一個步驟返回一個可用於下一步的定義明確的結構 (StepResult)。 如果有大量數據(比如大文件等),則資源的 URI/定位器將在 StepResult 中傳遞。
  6. 您的工作流將需要一個上下文來處理——在您引用的示例中,這將是文件的名稱、存檔的位置等等——所以想想一個 WorkflowContext
額外的想法

您可能還需要考慮以下內容 - 如果您計划將其作為大規模服務/服務器實施:

  1. 步驟可以在動態加載的庫中
  2. XML/JSON 文件中的工作流定義 - 同樣,在編輯時動態重新加載。
  3. 遠程調用和回調 - 使用回調 API 將作業提交到遠程服務。當遠程服務回調時,工作流執行在流程的后續步驟中被拾取。
  4. 盡可能並行執行等
  5. 無狀態設計

回滾可以很容易地適應這個結構,因為每個Step都將實現自己的rollback()方法,如果任何步驟失敗,工作流可以調用(最好以相反的順序)。

至於主要問題,這實際上取決於您想要獲得的復雜程度。 在基本層面上,您可以定義一個StepResult接口,它由每個步驟返回並傳遞給下一個步驟。 這種方法的明顯問題是每個步驟都應該“知道”期望StepResult的哪個實現。 對於小型系統,這可能是可以接受的,對於大型系統,您可能需要某種可配置的映射框架,可以告知如何將上一步的結果轉換為下一步的輸入。 所以Workflow將調用StepStep返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM