我们目前(2019 年夏季)致力于在工作流代码中添加对同步等待特定条件的直接支持。我们相信它会在 2019 年第三季度投入生产。
在那之前,最简单的解决方案是使用查询功能返回工作流状态。有关示例,请参见HelloQuery。此解决方案的主要缺点是客户端必须轮询工作流,直到状态更新以反映步骤 1 的结果。
如果您需要确保响应的低延迟,建议在工作流实例中执行请求/回复的模式是:
- 发起请求的进程需要暴露一个端点来完成请求。
- 同步请求首先向工作流发送信号。信号参数包括唯一的 requestId 以及客户端端点的主机和端口。然后它创建一个
CompletableFuture
并使用 requestId 作为键将其插入到地图中。然后请求线程在 this 上阻塞Future.get
。
- 收到信号后,工作流执行所有必要的活动和状态转换。然后回复工作流调用交付结果本地活动。此活动使用主机和端口调用完整的请求端点,并将 requestId 作为参数之一传递。
- 由于使用了特定于进程的主机和端口,因此请求处理程序在发送原始信号的同一进程中执行。然后它从映射中获取
CompletableFuture
原始请求线程被阻塞的位置,并使用作为另一个活动参数接收的请求结果来完成它。
- 原线程收到请求结果后,解除阻塞,可以继续执行。