亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何創建自定義工作流程定義?

如何創建自定義工作流程定義?

Go
阿波羅的戰車 2023-06-26 15:41:00
我們要求讓用戶創建自己的工作流程。這些工作流程可以具有簡單的是/否分支以及等待來自外部事件的信號。如果我們有完善的工作流定義,這不會是一個問題,但是由于工作流可以是動態的,這會帶來一個更棘手的問題。
查看完整描述

1 回答

?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

臨時工作流是直接實現業務邏輯的代碼。

對于無法在代碼中硬編碼業務邏輯的用例,應編寫外部工作流定義語言的解釋器。這種語言通常稱為 DSL,因為它們在針對特定領域實現時非常有用。DSL 通常基于 YAML/Json/XML。有時它只是數據庫表中的數據。

以下是我構建工作流程代碼以支持自定義 DSL 的方式:

  1. 接收當前工作流定義 ID 和狀態并返回要執行的操作列表的活動。此活動將當前狀態(包括最近執行的操作的結果)應用于適當的 DSL 實例。結果是接下來要執行的操作集。操作是 DSL 特定的,但最常見的是執行活動、等待特定信號、休眠一段時間、完成或失敗工作流程。

  2. 實現循環的工作流,該循環調用上述活動并執行請求的操作,直到請求工作流完成操作。

下面是一個簡單 DSL 的示例代碼,它指定了要執行的一系列活動:

@ActivityInterface

public interface Interpreter {

? String getNextStep(String workflowType, String lastActivity);

}


public class SequenceInterpreter implements Interpreter {


? // dslWorkflowType->(activityType->nextActivity)

? private final Map<String, Map<String, String>> definitions;


? public SequenceInterpreter(Map<String, Map<String, String>> definitions) {

? ? this.definitions = definitions;

? }


? @Override

? public String getNextStep(String workflowType, String lastActivity) {

? ? Map<String, String> stateTransitions = definitions.get(workflowType);

? ? return stateTransitions.get(lastActivity);

? }

}


@WorkflowInterface? ??

public interface InterpreterWorkflow {

? @WorkflowMethod

? String execute(String type, String input);

? @QueryMethod

? String getCurrentActivity();

}


public class InterpreterWorkflowImpl implements InterpreterWorkflow {


? private final Interpreter interpreter = Workflow.newActivityStub(Interpreter.class);


? private final ActivityStub activities =

? ? ? Workflow.newUntypedActivityStub(

? ? ? ? ? new ActivityOptions.Builder().setScheduleToCloseTimeout(Duration.ofMinutes(10)).build());


? private String currentActivity = "init";

? private String lastActivityResult;


? @Override

? public String execute(String workflowType, String input) {

? ? do {

? ? ? currentActivity = interpreter.getNextStep(workflowType, currentActivity);

? ? ? lastActivityResult = activities.execute(currentActivity, String.class, lastActivityResult);

? ? } while (currentActivity != null);

? ? return lastActivityResult;

? }


? @Override

? public String getCurrentActivity() {

? ? return currentActivity;

? }

}

顯然,現實生活中的解釋器活動將接收更復雜的狀態對象作為參數,并返回一個可能包含多種命令類型列表的結構。


查看完整回答
反對 回復 2023-06-26
  • 1 回答
  • 0 關注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號