首页 > 解决方案 > 如何对必须在其中一个步骤中返回结果的工作流进行建模

问题描述

假设我有一个工作流程:

  1. 做出指令
  2. 处理付款
  3. 向第三方发送 API 调用
  4. 等待第三次通过暴露的 webhook 调用我的 API

当我做:

workflow.makeOrder();

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

但如果我异步执行:

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

workflowExecution.getWorkflowId()

我无法获得第 1 步的结果。我该如何实现?

标签: cadence-workflow

解决方案


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

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

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

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

推荐阅读