訊號 - Amazon Simple Workflow Service

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

訊號

訊號可讓您將資訊注入運作中的工作流程執行。在某些情況下,您可能想要將資訊新增到運作中的工作流程執行,予以告知某個項目已變更或在發生外部事件時予以通知。任何程序都可以傳送訊號給已開啟的工作流程執行。例如,某個工作流程執行可能會對另一個工作流程執行發出訊號。

注意

嘗試傳送訊號給未開啟的工作流程執行會導致 SignalWorkflowExecution 失敗並出現 UnknownResourceFault

若要使用信號,請定義要傳遞至信號的訊號名稱和資料 (如果有的話)。然後,對決策程序進行編程以識別歷史中的信號事件(WorkflowExecutionSignaled)並對其進行適當處理。當程序想要向工作流程執行發出指示時,會呼叫 Amazon SWF (使用SignalWorkflowExecution動作,或者在決策程式的情況下,使用SignalExternalWorkflowExecution決策程式) 來指定目標工作流程執行的識別碼、訊號名稱和訊號資料。然後,Amazon SWF 會接收訊號,將其記錄在目標工作流程執行的歷史記錄中,並為其排程決策任務。決策者收到決策任務時,也會在工作流程執行歷史記錄內收到訊號。決策者接著可以根據訊號和其資料來採取適當的動作。

有時候,您可能想要等候訊號。例如,用戶可以通過發送信號來取消訂單,但只能在下訂單後一小時內取消訂單。Amazon SWF 沒有使決策程序能夠等待來自服務的信號的原始文件。決策者本身必須實作暫停功能。為了暫停,決策者應該使用 StartTimer 決策啟動計時器,這會指定決策者將等候訊號,同時繼續輪詢決策任務的時間。決策者收到決策任務時,應該檢查歷史記錄,了解是否已收到訊號或計時器已觸發。如果已收到訊號,則決策者應該取消計時器。不過反之,如果計時器已觸發,則表示訊號未在指定時間內抵達。總結來說,為了等候特定訊號,請執行下列動作。

  1. 針對決策者應該等候的時間長度,建立計時器。

  2. 收到決策任務後,檢查歷史記錄,了解訊號是否已抵達或計時器是否已觸發。

  3. 如果訊號已抵達,請使用 CancelTimer 決策取消計時器並處理訊號。根據計時,歷史記錄可包含 TimerFiredWorkflowExecutionSignaled 事件。在此情況下,您可以依據事件在歷史記錄中的相對順序,來決定哪個事件先出現。

  4. 如果計時器在收到訊號之前就已觸發,則決策者等候訊號已逾時。您可以停止執行,或執行任何適合您使用案例的其他邏輯。

對於應取消工作流程的情況 (例如,訂單本身已被客戶取消),應該使用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