活動實作 - AWS Flow Framework 對於爪哇

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

活動實作

以提供 @Activities 界面的實作來實作活動。所以此AWS Flow Framework使用在工作者中設定的活動實作執行個體,在執行時間處理活動任務。工作者會自動尋找合適類型的活動實作。

您可以使用屬性和欄位將資源傳遞給活動執行個體,例如資料庫連線。因為活動實作物件可從多個執行緒存取,所以必須使用安全的執行緒共享資源。

請注意,活動實作不接受 Promise<> 類型的參數或傳回此類型的物件。這是因為活動實作不應該取決於呼叫方式 (同步還是非同步)。

以前顯示的活動界面可以實作如下:

public class MyActivitiesImpl implements MyActivities { @Override @ManualActivityCompletion public int activity1(){ //implementation } @Override public void activity2(int foo){ //implementation } }

執行緒本機內容可供活動實作使用,用以擷取任務物件、使用中的資料轉換器物件等等。目前的內容可透過 ActivityExecutionContextProvider.getActivityExecutionContext() 存取。如需詳細資訊,請參閱 ActivityExecutionContext 的 AWS SDK for Java 文件和「執行內容」一節。

手動完成活動

上例中的 @ManualActivityCompletion 註釋是選擇性的註釋。它只能出現在實作活動的方法中,且用以設定當活動方法傳回時不會自動完成的活動。當您想要以非同步方式完成活動時,這很有用;例如,完成人力動作後手動完成活動。

當您的活動方法傳回時,框架預設視活動為完成。這表示,活動工作者向 Amazon SWF 報告活動任務完成並提供結果 (如有)。但是,當活動方法傳回時,有些使用案例您不希望將活動任務標記為完成。當您建立人力任務模型時特別實用。例如,活動方法可能要在活動任務完成前,先向必須完成某些工作的某人傳送電子郵件。在這種情況下,您可以使用 @ManualActivityCompletion 註釋來註釋活動方法,通知活動工作者它不應該自動完成活動。為手動完成活動,您可以使用ManualActivityCompletionClient或者使用RespondActivityTaskCompleted方法在 Amazon SWF 軟件開發工具包中提供的 Amazon SWF Java 客户端上。如需詳細資訊,請參閱 AWS SDK for Java 文件。

為完成活動任務,您需要提供任務字符。使用任務字符以唯 Amazon SWF 識別任務。您可在您的活動實作中從 ActivityExecutionContext 存取此字符。您必須將此字符傳遞到負責完成任務的一方。您可從 ActivityExecutionContext 呼叫 ActivityExecutionContextProvider.getActivityExecutionContext().getTaskToken() 來擷取此字符。

您可實作 Hello World 範例的 getName 活動,傳送電子郵件要求某人提供歡迎訊息:

@ManualActivityCompletion @Override public String getName() throws InterruptedException { ActivityExecutionContext executionContext = contextProvider.getActivityExecutionContext(); String taskToken = executionContext.getTaskToken(); sendEmail("abc@xyz.com", "Please provide a name for the greeting message and close task with token: " + taskToken); return "This will not be returned to the caller"; }

您也可以使用 ManualActivityCompletionClient,用以下的程式碼片段提供歡迎語並結束任務。或者,您也可以讓任務失敗:

public class CompleteActivityTask { public void completeGetNameActivity(String taskToken) { AmazonSimpleWorkflow swfClient = new AmazonSimpleWorkflowClient(...); // use AWS access keys ManualActivityCompletionClientFactory manualCompletionClientFactory = new ManualActivityCompletionClientFactoryImpl(swfClient); ManualActivityCompletionClient manualCompletionClient = manualCompletionClientFactory.getClient(taskToken); String result = "Hello World!"; manualCompletionClient.complete(result); } public void failGetNameActivity(String taskToken, Throwable failure) { AmazonSimpleWorkflow swfClient = new AmazonSimpleWorkflowClient(...); // use AWS access keys ManualActivityCompletionClientFactory manualCompletionClientFactory = new ManualActivityCompletionClientFactoryImpl(swfClient); ManualActivityCompletionClient manualCompletionClient = manualCompletionClientFactory.getClient(taskToken); manualCompletionClient.fail(failure); } }