

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 信号
<a name="swf-dev-adv-signals"></a>

信号可使您将信息插入正在运行的工作流执行中。在某些应用场景中，建议您将信息增加到正在运行的工作流执行中，使其了解有些情况发生了改变或向其通知外部事件。任何过程都能发送信号到开启的工作流执行中。例如，一个工作流执行可向另一个发送信号。

**注意**  
尝试将信号发送到未打开的工作流程执行会导致 `SignalWorkflowExecution` 失败，出现 `UnknownResourceFault` 错误。

要使用信号，请定义信号名称和要传递给信号的数据（如果有）。然后，对决策者进行编程，使其识别历史记录中的信号事件 ([WorkflowExecutionSignaled](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_WorkflowExecutionSignaledEventAttributes.html)) 并对其进行适当的处理。当流程想要发出工作流程执行信号时，它会调用 Amazon SWF（使用[SignalWorkflowExecution](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_SignalWorkflowExecution.html)操作，或者如果是决策者，则使用[SignalExternalWorkflowExecution](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_SignalExternalWorkflowExecutionInitiatedEventAttributes.html)决策），指定目标工作流程执行的标识符、信号名称和信号数据。然后，Amazon SWF 会接收信号，将其记录在目标工作流执行的历史记录中，并为其安排决策任务。当决策程序收到决策任务时，它还会接收到工作流执行历史内部的信号。然后，决策程序可根据信号及其数据采取适当操作。

有时，您可能需要等待信号。例如，用户可以通过发送信号取消订单，但只能在下单后一小时内取消订单。Amazon SWF 没有允许决策程序等待服务信号的基本功能。暂停功能需要决策程序自行执行。决策程序应使用 `StartTimer` 决策启动计时器来执行暂停功能，通过计时器指定决策程序在继续轮询决策任务时等待信号的持续时间。当决策程序收到决策任务时，它应该检查历史记录以查看信号是否已收到或计时器是否已启动。如果已收到信号，则决策程序应取消计时器。然而，如果未收到信号，计时器已启动，则表示信号未在指定时间内到达。简而言之，请执行以下操作来等待特定信号。

1. 为决策程序应等待的时间量创建计时器。

1. 收到决策任务时，检查历史记录以查看信号是否已到达或计时器是否已启动。

1. 如果信号已到达，请使用 `CancelTimer` 决策来取消计时器并处理该信号。历史记录中可能包含 `TimerFired` 和 `WorkflowExecutionSignaled` 事件，这取决于定时情况。在这种情况下，您可以依据历史记录中事件的相对顺序来确定首先发生的事件。

1. 收到信号前，如果计时器已启动，则决策程序等待信号超时。您可以放弃执行或执行适合您的使用案例的其它任何逻辑。

对于应取消工作流的情况（例如，订单本身已被客户取消）应使用 `RequestCancelWorkflowExecution` 操作，而不是向工作流发送信号。

以下是信号的一些应用情况：
+ 暂停工作流执行的进展，直到收到信号（例如，等待库存发货）。
+ 向工作流执行提供可能会影响决策程序做决策之逻辑的信息。这对受外部事件（例如，尝试在闭市后完成股票销售）影响的工作流很有用。
+ 在您期望发生更改时（例如，在下订单后发货之前更改订单数量）更新工作流执行。

在下面的示例中，工作流执行收到了取消订单的信号。

```
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
```