本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
本教學課程會說明如何使用 Java 和 AWS Step Functions,建立以活動為基礎的狀態機器。活動可讓您控制從狀態機器其他地方執行的工作者程式碼。如需概觀,請參閱 了解 Step Functions 中的狀態機器 中的 了解 Step Functions 中的活動。
為了完成本教學,您需要以下項目:
-
適用於 Java 的 開發套件
。本教學課程的範例活動是 Java 應用程式,使用 適用於 Java 的 AWS SDK 與 通訊 AWS。 -
AWS 環境中或標準 AWS 組態檔案中的 憑證。如需詳細資訊,請參閱《 適用於 Java 的 AWS SDK 開發人員指南》中的設定您的 AWS 登入資料。
步驟 1:建立活動
您必須讓 Step Functions 知道您想要建立其工作者 (程式) 的活動。Step Functions 會以建立活動身分的 Amazon Resource Name (ARN) 回應。使用此身分來協調狀態機器和工作者之間傳遞的資訊。
重要
確保您的活動任務與您的狀態機器位於相同的 AWS 帳戶。
-
在 Step Functions 主控台
的左側導覽窗格中,選擇活動。 -
選擇 Create activity (建立活動)。
-
輸入活動的名稱,例如
,然後選擇建立活動。get-greeting
-
建立活動任務時,請記下其 ARN,如以下範例所示。
arn:aws:states:us-east-1:123456789012:activity:get-greeting
步驟 2:建立狀態機器
建立狀態機器以決定何時呼叫您的活動,以及您的工作者何時應執行其主要工作、收集並傳回結果。若要建立狀態機器,您將使用 Workflow Studio 程式碼編輯器的 。
-
在 Step Functions 主控台
的左側導覽窗格中,選擇狀態機器。 -
在狀態機器頁面上,選擇建立狀態機器。
-
在選擇範本對話方塊中,選取空白。
-
選擇選取以在 中開啟工作流程 Studio設計模式。
-
在本教學課程中,您將在程式碼編輯器中寫入狀態機器的 Amazon States Language(ASL) 定義。若要執行此操作,請選擇程式碼。
-
移除現有的樣板程式碼並貼上下列程式碼。請記得將
Resource
欄位中的範例 ARN 取代為您稍早在 中建立的活動任務 ARN步驟 1:建立活動。{ "Comment": "An example using a Task state.", "StartAt": "getGreeting", "Version": "1.0", "TimeoutSeconds": 300, "States": { "getGreeting": { "Type": "Task", "Resource": "
arn:aws:states:us-east-1:123456789012:activity:get-greeting
", "End": true } } }這是使用 Amazon States Language(ASL) 的狀態機器描述。它定義名為
getGreeting
的單一Task
狀態。如需詳細資訊,請參閱狀態機器結構。 -
在 上圖形視覺化,請確定您新增的 ASL 定義的工作流程圖表看起來與下列圖表類似。
-
為您的狀態機器指定名稱。若要執行此操作,請選擇 MyStateMachine 預設狀態機器名稱旁的編輯圖示。然後,在狀態機器組態中,在狀態機器名稱方塊中指定名稱。
針對本教學課程,輸入名稱
ActivityStateMachine
。 -
(選用) 在狀態機器組態中,指定其他工作流程設定,例如狀態機器類型及其執行角色。
在此教學課程中,請保留狀態機器設定中的所有預設選擇。
如果您先前已為狀態機器建立具有正確許可的 IAM 角色,並想要使用它,請在許可中選擇現有角色,然後從清單中選擇角色。或選取輸入角色 ARN,然後為該 IAM 角色提供 ARN。
-
在確認角色建立對話方塊中,選擇確認以繼續。
您也可以選擇檢視角色設定以返回狀態機器組態。
注意
如果您刪除 Step Functions 建立的 IAM 角色,Step Functions 稍後無法重新建立該角色。同樣地,如果您修改角色 (例如,從 IAM 政策中的主體移除 Step Functions),Step Functions 稍後無法還原其原始設定。
步驟 3:實作工作者
建立工作者。工作者是一種程式,負責:
-
使用
GetActivityTask
API 動作輪詢活動的 Step Functions。 -
使用您的程式碼執行活動工作 (例如,以下程式碼中的
getGreeting()
方法)。 -
使用
SendTaskSuccess
、SendTaskFailure
和SendTaskHeartbeat
API 動作傳回結果。
注意
如需活動工作者的更完整範例,請參閱 範例:Ruby 中的活動工作者。此範例根據最佳實務提供實作,可供您的活動工作者參考。此程式碼會實作可為輪詢器和活動工作者設定執行緒數量的消費者-生產者模式。
實作工作者
-
建立名為
GreeterActivities.java
的檔案。 -
新增以下程式碼至其中。
import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.EnvironmentVariableCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.stepfunctions.AWSStepFunctions; import com.amazonaws.services.stepfunctions.AWSStepFunctionsClientBuilder; import com.amazonaws.services.stepfunctions.model.GetActivityTaskRequest; import com.amazonaws.services.stepfunctions.model.GetActivityTaskResult; import com.amazonaws.services.stepfunctions.model.SendTaskFailureRequest; import com.amazonaws.services.stepfunctions.model.SendTaskSuccessRequest; import com.amazonaws.util.json.Jackson; import com.fasterxml.jackson.databind.JsonNode; import java.util.concurrent.TimeUnit; public class GreeterActivities { public String getGreeting(String who) throws Exception { return "{\"Hello\": \"" + who + "\"}"; } public static void main(final String[] args) throws Exception { GreeterActivities greeterActivities = new GreeterActivities(); ClientConfiguration clientConfiguration = new ClientConfiguration(); clientConfiguration.setSocketTimeout((int)TimeUnit.SECONDS.toMillis(70)); AWSStepFunctions client = AWSStepFunctionsClientBuilder.standard() .withRegion(Regions.US_EAST_1) .withCredentials(new EnvironmentVariableCredentialsProvider()) .withClientConfiguration(clientConfiguration) .build(); while (true) { GetActivityTaskResult getActivityTaskResult = client.getActivityTask( new GetActivityTaskRequest().withActivityArn(ACTIVITY_ARN)); if (getActivityTaskResult.getTaskToken() != null) { try { JsonNode json = Jackson.jsonNodeOf(getActivityTaskResult.getInput()); String greetingResult = greeterActivities.getGreeting(json.get("who").textValue()); client.sendTaskSuccess( new SendTaskSuccessRequest().withOutput( greetingResult).withTaskToken(getActivityTaskResult.getTaskToken())); } catch (Exception e) { client.sendTaskFailure(new SendTaskFailureRequest().withTaskToken( getActivityTaskResult.getTaskToken())); } } else { Thread.sleep(1000); } } } }
注意
此範例中的
EnvironmentVariableCredentialsProvider
類別假設已設定AWS_ACCESS_KEY_ID
(或AWS_ACCESS_KEY
) 和AWS_SECRET_KEY
(或AWS_SECRET_ACCESS_KEY
) 環境變數。如需提供必要登入資料給工廠的詳細資訊,請參閱《 適用於 Java 的 AWS SDK 開發人員指南》中的 適用於 Java 的 AWS SDK API 參考》中的 AWSCredentialsProvider 和設定登入 AWS 資料和開發區域。根據預設, AWS 軟體開發套件最多會等待 50 秒,從伺服器接收任何操作的資料。此
GetActivityTask
操作是長時間輪詢操作,將等待最多 60 秒,以取得下一個可用任務。如要避免收到SocketTimeoutException
錯誤,請將 SocketTimeout 設為 70 秒。 -
在
GetActivityTaskRequest().withActivityArn()
建構器的參數清單中,將ACTIVITY_ARN
值取代為您先前在 中建立之活動任務的 ARN步驟 1:建立活動。
步驟 4:執行狀態機器
當您開始執行狀態機器時,工作者會輪詢 Step Functions 以進行活動、執行其工作 (使用您提供的輸入),並傳回其結果。
-
在
ActivityStateMachine
頁面上,選擇 Start execution (開始執行)。隨即顯示開始執行對話方塊。
-
在開始執行對話方塊中,執行下列動作:
-
(選用) 輸入自訂執行名稱以覆寫產生的預設值。
非 ASCII 名稱和記錄
Step Functions 接受包含非 ASCII 字元的狀態機器、執行、活動和標籤名稱。由於這類字元不適用於 Amazon CloudWatch,因此我們建議您僅使用 ASCII 字元,以便在 CloudWatch 中追蹤指標。
-
在輸入方塊中,輸入下列 JSON 輸入來執行您的工作流程。
{ "who": "AWS Step Functions" }
-
選擇 Start execution (開始執行)。
-
Step Functions 主控台會引導您前往標題為執行 ID 的頁面。此頁面稱為執行詳細資訊頁面。在此頁面上,您可以在執行進行時或完成後檢閱執行結果。
若要檢閱執行結果,請在圖形檢視中選擇個別狀態,然後選擇步驟詳細資訊窗格上的個別索引標籤,分別檢視每個狀態的詳細資訊,包括輸入、輸出和定義。如需您可以在執行詳細資訊頁面上檢視之執行資訊的詳細資訊,請參閱 執行詳細資訊概觀。
-
步驟 5:執行和停用工作者
若要讓工作者輪詢您的活動狀態機器,您必須執行工作者。
-
在命令列上,導覽至您建立
GreeterActivities.java
的目錄。 -
若要使用 AWS SDK,請將
lib
和third-party
目錄的完整路徑新增至建置檔案的相依性,以及 JavaCLASSPATH
。如需詳細資訊,請參閱《 適用於 Java 的 AWS SDK 開發人員指南》中的下載和擷取 SDK。 -
編譯檔案。
$ javac GreeterActivities.java
-
執行 檔案。
$ java GreeterActivities
-
在 Step Functions 主控台
上,導覽至執行詳細資訊頁面。 -
執行完成時,請檢查執行的結果。
-
停用工作者。