如何建模必须 return 在其中一个步骤中产生结果的工作流

How to model a workflow that has to return a result in one of the steps

假设我有一个工作流程:

  1. 下订单
  2. 处理付款
  3. 向第 3 方发送 API 呼叫
  4. 等待第 3 次通过暴露的 webhook 调用我的 API

当我这样做时:

workflow.makeOrder();

这会阻塞,所以在第 1-4 步完成之前我无法得到结果。

但如果我异步执行:

WorkflowExecution workflowExecution = WorkflowClient.start(workflow::makeOrder);

workflowExecution.getWorkflowId()

我无法得到步骤1的结果,我该如何实现?

我们目前(2019 年夏季)致力于在工作流代码中添加对同步等待特定条件的直接支持。我们相信它会在 2019 年第三季度投入生产。

在那之前,最简单的解决方案是使用 return 工作流状态的查询功能。有关示例,请参见 HelloQuery。此解决方案的主要缺点是客户端必须轮询工作流,直到更新状态以反映步骤 1 的结果。

如果您需要确保响应的低延迟,建议在工作流实例中执行 request/reply 的模式是:

  • 发起请求的进程需要公开端点以完成请求。
  • 同步请求首先向工作流发送信号。信号参数包括唯一的 requestId 以及客户端端点的主机和端口。然后它创建一个 CompletableFuture 并使用 requestId 作为键将其插入到地图中。然后请求线程阻塞在这个 Future.get 上。
  • 收到信号后,工作流将执行所有必要的活动和状态转换。然后为了回复工作流调用 deliver result 本地 activity。 activity 使用主机和端口调用完整的请求端点并将 requestId 作为参数之一传递。
  • 由于使用了特定于进程的主机和端口,因此请求处理程序在发送原始信号的同一进程中执行。然后它从映射中获取原始请求线程被阻塞的 CompletableFuture 并使用作为另一个 activity 参数接收到的请求结果完成它。
  • 原线程收到请求结果解除阻塞,可以继续执行