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

martinni39:

我们有让用户创建自己的工作流程的要求。这些工作流程可以具有简单的是/否分支,以及等待来自外部事件的信号。如果我们拥有完善的工作流程定义,这将不是一个问题,但是由于工作流程可以是动态的,因此会带来很多棘手的问题。

马克西姆·费特耶夫(Maxim Fateev):

Cadence工作流是直接实现您的业务逻辑的代码。

对于用代码对业务逻辑进行硬编码的选择用例,则应编写外部工作流定义语言的解释器。这种语言通常称为DSL,因为它们在针对特定域实施时确实非常有用。DSL通常基于YAML / Json / XML。有时,它只是数据库表中的数据。

这是构造工作流代码以支持自定义DSL的方式:

  1. 接收当前工作流程定义ID和状态并返回要执行的操作列表的活动。此活动将当前状态(包括对最近执行的操作的结果)应用于适当的DSL实例。结果是下一组要执行的操作。操作是特定于DSL的,但最常见的操作是执行活动,等待特定信号,休眠一段时间,完成或失败工作流程
  2. 工作流实现一个循环,该循环调用上述活动并执行请求的操作,直到请求工作流完成操作为止。

这是普通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;
  }
}

显然,现实生活中的解释器活动将接收更复杂的状态对象作为参数,并返回可能包含多种命令类型列表的结构。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将自定义工作流程添加到“创建项目”屏幕

Alfresco:如何更改自定义工作流程的启动任务名称?

Visual Studio在线自定义工作项/工作流程

如何在AEM中以编程方式启动工作流程时提供自定义工作流程标题

使用自定义工作流程构建OmniAuth策略

AEM-具有作者内容验证功能的自定义工作流程?

CRM自定义工作流程,使用多线程

在JAVA和Spring中设计自定义工作流程

自定义工作流程活动未显示在插件注册中

自定义工作流程活动未更新输入参数

如何使用自定义工作流步骤查找所有工作流

DocuSign:使用DocuSign AddRecipients的自定义工作流程,无法添加相同的收件人

Suitescript 2.0 - 如何将自定义工作流字段放入脚本中

如何在自定义工作流程中以特定的“支持”管理员用户身份发送电子邮件?

为自定义工作流插件自定义HippoCms ActivityStream消息

自定义SSIS工作流程任务

滑动演讲站点:工作流程和自定义

Spring Activiti工作流程配置自定义架构

CRM 2011自定义工作流访问已创建的记录触发器中的数据

CRM 2013通过自定义工作流获取CRM URL

使用早期绑定的MS CRM自定义工作流

Dynamics CRM自定义工作流插件-阅读“何时开始”上下文?

为模型更改表单视图设置自定义工作流

CRM Online V9 中的自定义工作流与插件执行超时?

具有通用类型的MS CRM自定义工作流活动输出

SharePoint 2010自定义工作流-只是事件接收者的名字吗?

CRM 自定义工作流发布者前缀在部署后更改

如何在TFS中使用过渡工作流创建自定义字段

如何在 django-registration 2.2(HMAC 激活工作流程)中添加自定义字段(名字和姓氏)?