为了账号安全,请及时绑定邮箱和手机立即绑定

如何创建自定义工作流程定义?

如何创建自定义工作流程定义?

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 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信