我们有让用户创建自己的工作流程的要求。这些工作流可以具有简单的是/否分支,以及等待来自外部事件的信号。如果我们拥有完善的工作流程定义,这将不是一个问题,但是,由于工作流程是动态的,因此会带来很多棘手的问题。
答案 0 :(得分:1)
Cadence工作流是直接实现您的业务逻辑的代码。
对于不能用代码对业务逻辑进行硬编码的用例,应编写外部工作流定义语言的解释器。这种语言通常称为DSL,因为它们在针对特定域实施时确实非常有用。 DSL通常基于YAML / Json / XML。有时,它只是数据库表中的数据。
这是我如何构造工作流代码以支持自定义DSL的方法:
这是一个普通DSL的示例代码,它指定了要执行的一系列活动:
public interface Interpreter {
@ActivityMethod
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);
}
}
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;
}
}
显然,现实生活中的解释器活动将接收更复杂的状态对象作为参数,并返回可能包含多种命令类型列表的结构。