如何建模必须 return 在其中一个步骤中产生结果的工作流
How to model a workflow that has to return a result in one of the steps
假设我有一个工作流程:
- 下订单
- 处理付款
- 向第 3 方发送 API 呼叫
- 等待第 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 参数接收到的请求结果完成它。
- 原线程收到请求结果解除阻塞,可以继续执行
假设我有一个工作流程:
- 下订单
- 处理付款
- 向第 3 方发送 API 呼叫
- 等待第 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 参数接收到的请求结果完成它。 - 原线程收到请求结果解除阻塞,可以继续执行