如何为必须在以下步骤之一中返回结果的工作流建模

时间:2019-07-25 08:47:54

标签: cadence-workflow

假设我有一个工作流程:

  1. 下订单
  2. 处理付款
  3. 将API调用发送给第三方
  4. 等待3rd通过暴露的Webhook调用我的API

当我这样做时:

workflow.makeOrder();

这将阻止,所以直到步骤1-4完成后我才能得到结果。

但是,如果我不这样做:

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

workflowExecution.getWorkflowId()

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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