Client Advanced
Flow 关闭期间的请求
Flow 关闭期间,Dex 会以 gRPC FAILED_PRECONDITION 和子状态 FLOW_CLOSING 拒绝新发起的事务性或带锁的 RPC、WaitForStepCompletion、WaitForAttributeMatch 和 Channel 消息删除。每种 SDK 都提供有类型的 Flow closing 错误。决定是否需要进一步操作前,应重新读取保留的 Flow 终态。该错误不能证明先前的请求已经成功。
等待 Flow
WaitForFlow 等待 Flow 到达 terminal status。bounded wait 在 Flow 仍然 open 时会返回 long-poll timeout;再次调用即可继续等待。
result = await client.wait_for_flow("order-123", timedelta(minutes=1))
例子: examples/python/dex_examples/primitives/client-apis/controller.py
等待 Step
WaitForStepCompletion 在 Flow 继续运行时等待一个 StepExecutionID。它只确认完成,不返回 Step output。
await client.wait_for_step_completion("order-123", StepExecutionId("ChargeOrder"), timedelta(minutes=1))
例子: examples/python/dex_examples/products/order-processing/controller.py
等待 Attribute 匹配
WaitForAttributeMatch 等待 Attribute 满足类型化的 scalar 比较,并返回当前命中的值。它定位当前 active run。对于 AttributeMap,还需要传入 instance。
String 和 Boolean 支持 equal 与 not-equal。整数和浮点数还支持 greater-than、greater-than-or-equal、less-than 与 less-than-or-equal。缺失的 Attribute 永远不命中。
当调用方需要在状态变化后刷新时,使用应用拥有的 revision Attribute。等待 revision 大于上次观察到的值,再调用 Describe 或 read RPC。Revision 是 watermark;快速变化可能合并为一个返回值。
revision = await app_state.client.wait_for_attribute_match(
flow_id,
app_state.job_post.update_version,
AttributeMatch.greater_than(required_int_query("lastRevision")),
timedelta(seconds=30),
)
例子: examples/python/dex_examples/products/job-post/controller.py
object、bytes、null、blob-backed、非有限浮点、跨类型比较和无效 ordering 比较会被拒绝。完整 revision 模式见等待 Attribute 匹配。
查看 Flow
DescribeFlow 读取 current 或 latest run 的 IDs、Flow type、status 和 start time。Go SDK 还会返回可用的 close time。它不会等待 Flow 结束。只读 RPC 返回非终态业务状态后,可以用它做一次状态检查。ID 不存在或不属于 Flow 时,会返回有类型的 Flow-not-found 错误。
info = await client.describe_flow("order-123")
例子: examples/python/dex_examples/primitives/client-apis/controller.py
搜索 Flow
SearchFlows 返回匹配 visibility query 的一页 Flow runs,并排除服务器内部的 execution。search 用来寻找 Flow instance;DescribeFlow 用于查看一个已知 Flow ID。要继续搜索,传回 page token。
翻页时保持查询不变。
page = await client.search_flows("FlowType = 'ClientApisFlow'", 20, "")
例子: examples/python/dex_examples/primitives/client-apis/controller.py
跳过 Timer
SkipTimer 让一个等待中的 Timer 立刻 ready。选择 Step execution,以及 Timer 的 condition ID 或它从零开始的 condition index。
await client.skip_timer("order-123", StepExecutionId("ChargeOrder"), TimerId.by_condition_id("retry"))
例子: examples/python/dex_examples/products/order-processing/controller.py
更新 FlowConfig
UpdateFlowConfig 修改 active Flow 的 FlowConfig。只发送要修改的字段。SDK 的这个调用不会改变 Flow 的 Worker 路由。字段说明见 用 Client 更新 FlowConfig。
触发 continue-as-new
TriggerContinueAsNew 已弃用。Dex 不会把 Flow continue as new。这个调用总是以 UNIMPLEMENTED 失败。不要调用它。长期运行的 Flow 不需要滚动,因为 Dex Server 只保留最近的 history 窗口。
Time travel
TimeTravel 从已有 Flow history 的某个点创建一个新的 run attempt。run 保留原来的 Run ID。这个点必须位于最近的 history 窗口内,否则调用以 FAILED_PRECONDITION 失败。Time travel 到开头总是可用。
new_run_id = await client.time_travel("order-123", TimeTravelOptions(type=TimeTravelType.BEGINNING, reason="code fix"))
例子: examples/python/dex_examples/primitives/flow/controller.py