cadence-workflow - 如何对必须在其中一个步骤中返回结果的工作流进行建模
问题描述
假设我有一个工作流程:
- 做出指令
- 处理付款
- 向第三方发送 API 调用
- 等待第三次通过暴露的 webhook 调用我的 API
当我做:
workflow.makeOrder();
这会阻塞,所以在步骤 1-4 完成之前我无法得到结果。
但如果我异步执行:
WorkflowExecution workflowExecution = WorkflowClient.start(workflow::makeOrder);
workflowExecution.getWorkflowId()
我无法获得第 1 步的结果。我该如何实现?
解决方案
我们目前(2019 年夏季)致力于在工作流代码中添加对同步等待特定条件的直接支持。我们相信它会在 2019 年第三季度投入生产。
在那之前,最简单的解决方案是使用查询功能返回工作流状态。有关示例,请参见HelloQuery。此解决方案的主要缺点是客户端必须轮询工作流,直到状态更新以反映步骤 1 的结果。
如果您需要确保响应的低延迟,建议在工作流实例中执行请求/回复的模式是:
- 发起请求的进程需要暴露一个端点来完成请求。
- 同步请求首先向工作流发送信号。信号参数包括唯一的 requestId 以及客户端端点的主机和端口。然后它创建一个
CompletableFuture
并使用 requestId 作为键将其插入到地图中。然后请求线程在 this 上阻塞Future.get
。 - 收到信号后,工作流执行所有必要的活动和状态转换。然后回复工作流调用交付结果本地活动。此活动使用主机和端口调用完整的请求端点,并将 requestId 作为参数之一传递。
- 由于使用了特定于进程的主机和端口,因此请求处理程序在发送原始信号的同一进程中执行。然后它从映射中获取
CompletableFuture
原始请求线程被阻塞的位置,并使用作为另一个活动参数接收的请求结果来完成它。 - 原线程收到请求结果后,解除阻塞,可以继续执行。
推荐阅读
- python - 无法向 SQLAlchemy 提交数据:AttributeError:“scoped_session”对象没有属性“session”
- python - 无法导入熊猫库
- rest - REST API中将项目添加到集合的正确方法是什么 - POST或PUT
- javascript - 如何使用谷歌时间线图以天而不是日期显示轴
- python - Dockerized Python Flask REST API 显示“页面不工作
- machine-learning - 如何使用 PyTorch 在自定义图像数据集中创建训练验证拆分?
- java - 如何在 PreferenceScreen 中为 PreferenceSwitch 设置 TapTargetView
- wikidata - 获取 wikidata 最旧和最新的修订时间戳
- javascript - 自带搜索框,x按钮不隐藏
- c# - Bot Framework V4 依赖注入不起作用