尚方宝剑之说
临时工作流是直接实现业务逻辑的代码。对于无法在代码中硬编码业务逻辑的用例,应编写外部工作流定义语言的解释器。这种语言通常称为 DSL,因为它们在针对特定领域实现时非常有用。DSL 通常基于 YAML/Json/XML。有时它只是数据库表中的数据。以下是我构建工作流程代码以支持自定义 DSL 的方式:接收当前工作流定义 ID 和状态并返回要执行的操作列表的活动。此活动将当前状态(包括最近执行的操作的结果)应用于适当的 DSL 实例。结果是接下来要执行的操作集。操作是 DSL 特定的,但最常见的是执行活动、等待特定信号、休眠一段时间、完成或失败工作流程。实现循环的工作流,该循环调用上述活动并执行请求的操作,直到请求工作流完成操作。下面是一个简单 DSL 的示例代码,它指定了要执行的一系列活动:@ActivityInterfacepublic 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; }}显然,现实生活中的解释器活动将接收更复杂的状态对象作为参数,并返回一个可能包含多种命令类型列表的结构。