Рабочие процессы Cadence - это код, который непосредственно реализует вашу бизнес-логику.
Для случаев использования, когда жесткое кодирование бизнес-логики в коде не является опцией, должен быть написан интерпретатор языка определения внешнего рабочего процесса.Такой язык часто называют DSL, поскольку он действительно полезен при реализации для определенного домена.DSL часто основаны на YAML / Json / XML.Иногда это просто данные в таблицах БД.
Вот как я должен структурировать код рабочего процесса для поддержки пользовательских DSL:
- Действие, которое получает идентификатор и состояние определения текущего рабочего процесса и возвращает его.список операций для выполнения.Это действие применяет текущее состояние (которое включает результаты к последним выполненным операциям) к соответствующему экземпляру DSL.Результатом является набор следующих операций для выполнения.Операции специфичны для 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;
}
}
Очевидно,реальная деятельность интерпретатора будет получать более сложный объект состояния в качестве параметра и возвращать структуру, которая потенциально содержит список из нескольких типов команд.