1 回答

TA貢獻1788條經驗 獲得超4個贊
臨時工作流是直接實現業務邏輯的代碼。
對于無法在代碼中硬編碼業務邏輯的用例,應編寫外部工作流定義語言的解釋器。這種語言通常稱為 DSL,因為它們在針對特定領域實現時非常有用。DSL 通常基于 YAML/Json/XML。有時它只是數據庫表中的數據。
以下是我構建工作流程代碼以支持自定義 DSL 的方式:
接收當前工作流定義 ID 和狀態并返回要執行的操作列表的活動。此活動將當前狀態(包括最近執行的操作的結果)應用于適當的 DSL 實例。結果是接下來要執行的操作集。操作是 DSL 特定的,但最常見的是執行活動、等待特定信號、休眠一段時間、完成或失敗工作流程。
實現循環的工作流,該循環調用上述活動并執行請求的操作,直到請求工作流完成操作。
下面是一個簡單 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;
? }
}
顯然,現實生活中的解釋器活動將接收更復雜的狀態對象作為參數,并返回一個可能包含多種命令類型列表的結構。
- 1 回答
- 0 關注
- 177 瀏覽
添加回答
舉報