本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon Simple Workflow Service 信号
信号可使您通知外部事件的工作流程执行并将信息插入正在运行的工作流程执行中。任何程序都能通过调用 SignalWorkflowExecution
API 将信号发送到正在运行的工作流程执行中。收到信号后,Amazon SWF 会在工作流程执行历史中将其记录为WorkflowExecutionSignaled
事件并通过排定决策任务来提醒决策程序。
注意
尝试将信号发送到未打开的工作流程执行会导致 SignalWorkflowExecution
失败,出现 UnknownResourceFault
错误。
在这个示例中,将会发送取消订单信号到工作流程执行。
https://swf.us-east-1.amazonaws.com SignalWorkflowExecution {"domain": "867530901", "workflowId": "20110927-T-1", "runId": "f5ebbac6-941c-4342-ad69-dfd2f8be6689", "signalName": "CancelOrder", "input": "order 3553"}
如果工作流程执行接收到信号,Amazon SWF 会返回与下面类似的成功 HTTP 响应。Amazon SWF 将生成一个决策任务以通知决策程序处理该信号。
HTTP/1.1 200 OK Content-Length: 0 Content-Type: application/json x-amzn-RequestId: bf78ae15-3f0c-11e1-9914-a356b6ea8bdf
有时,您可能需要等待信号。例如,用户可能会通过发送信号来取消订单,但只能在发出订单后一小时内取消。Amazon SWF 没有可以让决策程序等待来自服务的信号的基元。暂停功能需要决策程序自行执行。决策程序应使用 StartTimer
决策启动计时器来执行暂停功能,通过计时器指定决策程序在继续轮询决策任务时等待信号的持续时间。当决策程序收到决策任务时,它应该检查历史记录以查看信号是否已收到或计时器是否已启动。如果已收到信号,则决策程序应取消计时器。然而,如果未收到信号,计时器已启动,则表示信号未在指定时间内到达。简而言之,请执行以下操作来等待特定信号。
-
为决策程序应等待的时间量创建计时器。
-
收到决策任务时,检查历史记录以查看信号是否已到达或计时器是否已启动。
-
如果信号已到达,请使用
CancelTimer
决策来取消计时器并处理该信号。历史记录中可能包含TimerFired
和WorkflowExecutionSignaled
事件,这取决于定时情况。在这种情况下,您可以依据历史记录中事件的相对顺序来确定首先发生的事件。 -
收到信号前,如果计时器已启动,则决策程序等待信号超时。您可以放弃执行或执行适合您的使用案例的其它任何逻辑。