

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 訊號
<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
```