本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Amazon SWF 中開發活動工作者
活動工作者提供一或多個活動類型的實作。活動工作者會與 Amazon SWF 進行通訊,以接收並執行活動任務。您可以有多個活動工作者執行相同活動類型的活動任務。
決策者排程活動任務時,Amazon SWF 會讓活動任務供活動工作者使用。決策者排程活動任務時,會提供活動工作者執行活動任務所需的資料 (由您決定)。Amazon SWF 會將此資料插入活動任務,再將之傳送至活動工作者。
活動工作者將由您管理。活動工作者可以使用任何語言進行撰寫。工作者只要可以透過 API 與 Amazon SWF 進行通訊,即可於任何位置執行。因為 Amazon SWF 提供執行活動任務所需的所有資訊,所以所有活動工作者都可以是無狀態。無狀態可讓工作流程具高度擴充性;若要處理增加的容量需求,只需要新增更多活動工作者即可。
本節將說明如何實作活動工作者。活動工作者應該重複執行下列作業。
-
向輪詢 Amazon SWF 執行活動任務。
-
開始執行任務。
-
如果任務為長期執行,則會定期向報告活動訊號給 Amazon SWF。
-
報告任務已完成或失敗,並將結果傳回給 Amazon SWF。
輪詢活動任務
若要執行活動任務,每個活動工作者都必須定期呼叫PollForActivityTask
動作。
在下列範例中,活動工作者 ChargeCreditCardWorker01
會輪詢任務清單 ChargeCreditCard-v0.1
上的任務。如果沒有活動任務,會在 60 秒後送回空回應。空回應是 taskToken
值為空白字串的 Task
結構。
https://swf.us-east-1.amazonaws.com PollForActivityTask { "domain" : "867530901", "taskList" : { "name": "ChargeCreditCard-v0.1" }, "identity" : "ChargeCreditCardWorker01" }
如果有活動任務,則 Amazon SWF 會將之傳回給活動工作者。任務包含決策者在排程活動時指定的資料。
活動工作者收到活動任務之後,即準備好要執行工作。下節將提供執行活動任務的相關資訊。
執行活動任務
收到活動任務之後,活動工作者即準備好執行之。
執行活動任務
-
程式設計活動工作者,解譯任務中輸入欄位的內容。此欄位包含決策者在排程任務時指定的資料。
-
程式設計活動工作者,開始處理資料和執行您的邏輯。
下節將説明如何程式設計活動工作者,將狀態更新提供給 Amazon SWF,讓您執行長時間執行的活動。
報告活動任務活動訊號
如果已向活動類型註冊活動訊號逾時,則活動工作者必須在超過活動訊號逾時之前記錄活動訊號。如果活動任務未在逾時內提供活動訊號,則任務會逾時,則 Amazon SWF 會予以關閉並排程新的決策任務,以通知決策者此逾時情形。決策者接著可以重新排程活動任務,或採取另一個動作。
逾時之後,如果活動工作者嘗試連絡 Amazon SWF,例如呼叫RespondActivityTaskCompleted
,Amazon SWF 將返回UnknownResource
錯能力
本節將說明如何提供活動的活動訊號。
若要記錄活動任務活動訊號,請程式設計活動工作者,呼叫 RecordActivityTaskHeartbeat
動作。此動作也提供字串欄位,可用來存放任意形式的資料,便於以適合您應用程式的方式來量化進度。
在此範例中,活動工作者會向回報 Amazon SWF,並使用詳細資訊欄位回報活動任務已完成 40%。若要回報活動訊號,活動工作者必須指定活動任務的任務字符。
https://swf.us-east-1.amazonaws.com RecordActivityTaskHeartbeat { "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223", "details" : "40" }
此動作本身不會在工作流程執行歷史記錄中建立事件;不過,如果任務逾時,則工作流程執行歷史記錄將會包含 ActivityTaskTimedOut
事件,以包含來自活動工作者所產生的最後一個活動訊號中的資訊。
完成或讓活動任務失敗
執行任務之後,活動工作者應該回報活動任務已完成還是失敗。
完成活動任務
若要完成活動任務,請程式設計活動工作者,在成功完成活動任務之後呼叫 RespondActivityTaskCompleted
動作,指定任務字符。
在此範例中,活動工作者指出任務已順利完成。
https://swf.us-east-1.amazonaws.com RespondActivityTaskCompleted { "taskToken": "12342e17-80f6-FAKE-TASK-TOKEN32f0223", "results": "40" }
活動完成時,Amazon SWF 會排程與活動相關聯之工作流程執行的新決策任務。
程式設計活動工作者,在即將完成任務之後輪詢另一個活動任務。這會建立活動工作者持續輪詢並完成任務的迴圈。
如果活動在開始關閉超時週期,或者如果計劃關閉超時,則 Amazon SWF 會逾時活動任務,並排程決策任務。這可讓決策者採取適當的動作 (例如重新排程任務)。
例如,如果 Amazon EC2 實例執行活動任務,而執行個體在任務完成之前失敗,則決策者會在工作流程執行歷史記錄中收到逾時事件。如果活動任務使用活動訊號,則任務無法在 Amazon EC2 實例失敗之後交付下個活動訊號時,決策者會收到事件。否則,活動任務無法在到達其中一個整體逾時之前完成時,決策者最終會收到事件。決策者接著可決定要重新指派任務,或採取其他動作。
讓活動任務失敗
如果活動工作者因某個原因而無法執行活動任務,但仍能與 Amazon SWF 進行通訊,請程式設計活動工作者讓任務失敗。
若要程式設計活動工作者讓活動任務失敗,請程式設計活動工作者,呼叫可指定任務之任務字符的 RespondActivityTaskFailed
動作。
https://swf.us-east-1.amazonaws.com RespondActivityTaskFailed { "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223", "reason" : "CC-Invalid", "details" : "Credit Card Number Checksum Failed" }
身為開發人員,您可以定義存放在原因和詳細資訊欄位中的值。這些是任意形式的字串;您可以使用您應用程式適用的任何錯誤代碼慣例。Amazon SWF 不處理這些值。不過,Amazon SWF 可能會在主控台中顯示這些值。
活動任務失敗時,Amazon SWF 會排程與活動任務相關聯之工作流程執行的決策任務,來通知決策者此失敗情形。程式設計決策者,根據失敗的因素來處理失敗的活動,例如重新排程活動,或讓工作流程執行失敗。
啟動活動工作者
若要啟動活動工作者,請將邏輯封裝至可用於活動工作者平台的執行檔。例如,您可以將活動程式碼封裝為可在 Linux 和 Windows 伺服器上執行的 Java 執行檔。
啟動之後,工作者會開始輪詢任務。決策者排程活動任務之前,這些輪詢會逾時且沒有任務,而工作者會繼續輪詢。
因為輪詢是對外請求,所以活動工作者可以在任何可存取 Amazon SWF 端點的網路上執行。
您可以視需要啟動任意數目的活動工作者。決策者排程活動任務時,Amazon SWF 會將活動任務自動分配給輪詢活動工作者。