建置簡單的 Amazon SWF 應用程式 - AWS SDK for Java 1.x

AWS SDK for Java 1.x 已於 2025 年 12 月 31 日end-of-support。我們建議您遷移至 AWS SDK for Java 2.x,以繼續接收新功能、可用性改善和安全性更新。

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

建置簡單的 Amazon SWF 應用程式

本主題將介紹如何使用 編寫Amazon SWF應用程式 AWS SDK for Java,同時在整個過程中介紹幾個重要概念。

關於範例

此範例專案會建立工作流程,其中包含單一活動,接受透過 AWS 雲端傳遞的工作流程資料 (在 HelloWorld 的傳統中,它會是有人打招呼的名稱),然後列印問候語以回應。

雖然這在表面上看起來非常簡單, Amazon SWF 但應用程式由多個組件一起運作:

  • 網域,用作工作流程執行資料的邏輯容器。

  • 一或多個工作流程,代表定義工作流程活動和子工作流程之邏輯執行順序的程式碼元件。

  • 工作流程工作者,也稱為決策者,會輪詢決策任務並排程活動或子工作流程以回應。

  • 一或多個活動,每個活動代表工作流程中的工作單位。

  • 輪詢活動任務並執行活動方法以回應的活動工作者

  • 一或多個任務清單,這些是 維護的佇列, Amazon SWF 用於向工作流程和活動工作者發出請求。任務清單上適用於工作流程工作者的任務稱為決策任務。適用於活動工作者的那些任務稱為活動任務

  • 開始工作流程執行的工作流程啟動者。

在幕後, Amazon SWF 會協調這些元件的操作、協調其來自 AWS 雲端的流程、在它們之間傳遞資料、處理逾時和活動訊號通知,以及記錄工作流程執行歷史記錄。

先決條件

開發環境

本教學中使用的開發環境包含:

  • AWS SDK for Java

  • Apache Maven (3.3.1)。

  • JDK 1.7 或更新版本。本教學課程是使用 JDK 1.8.0 進行開發和測試。

  • 良好的 Java 文字編輯器 (由您選擇)。

注意

如果您使用與 Maven 不同的建置系統,您仍然可以使用適合您環境的步驟建立專案,並使用此處提供的概念來遵循。有關設定和使用 AWS SDK for Java 搭配各種建置系統的詳細資訊,請參閱 入門

同樣地,但只要付出更多努力,就可以使用任何支援 AWS SDKs 實作此處顯示的步驟 Amazon SWF。

包含所有必要的外部相依性 AWS SDK for Java,因此無需下載任何額外的項目。

AWS 存取

若要成功完成本教學課程,您必須能夠存取 AWS 存取入口網站,如本指南的基本設定一節所述

這些指示說明如何存取您複製並貼到本機共用credentials檔案的臨時登入資料。您貼上的臨時登入資料必須與 中的 IAM 角色相關聯 AWS IAM Identity Center ,該角色具有存取 Amazon SWF 的許可。貼上臨時登入資料後,您的credentials檔案看起來會類似以下內容。

[default] aws_access_key_id=AKIAIOSFODNN7EXAMPLE aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY aws_session_token=IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZVERYLONGSTRINGEXAMPLE

這些臨時登入資料與default設定檔相關聯。

建立 SWF 專案

  1. 使用 Maven 啟動新專案:

    mvn archetype:generate -DartifactId=helloswf \ -DgroupId=aws.example.helloswf -DinteractiveMode=false

    這會建立具有標準 maven 專案結構的新專案:

    helloswf ├── pom.xml └── src ├── main │   └── java │   └── aws │   └── example │   └── helloswf │   └── App.java └── test └── ...

    您可以忽略或刪除test目錄及其包含的所有內容,我們不會將其用於本教學課程。您也可以刪除 App.java,因為我們會將它取代為新的類別。

  2. 編輯專案pom.xml的檔案,並在 <dependencies>區塊中新增其相依性,以新增 aws-java-sdk-simpleworkflow 模組。

    <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-simpleworkflow</artifactId> <version>1.11.1000</version> </dependency> </dependencies>
  3. 請確定 Maven 使用 JDK 1.7+ 支援建置您的專案。在 中將下列項目新增至您的專案 (<dependencies>區塊之前或之後)pom.xml

    <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>

為專案編寫程式碼

範例專案將包含四個不同的應用程式,我們將逐一造訪:

  • HelloTypes.java - 包含與其他元件共用的專案網域、活動和工作流程類型資料。它還處理向 SWF 註冊這些類型。

  • ActivityWorker.java - 包含活動工作者,它會輪詢活動任務並執行活動以回應。

  • WorkflowWorker.java - 包含工作流程工作者 (決策者),它會輪詢決策任務並排程新活動。

  • WorkflowStarter.java - 包含工作流程啟動器,這會啟動新的工作流程執行,這將導致 SWF 開始產生決策和工作流程任務,以供工作者使用。

所有來源檔案的常見步驟

您為容納 Java 類別而建立的所有檔案都會有幾個共同點。基於時間考量,每次將新檔案新增至專案時,這些步驟都會隱含

  1. 在專案src/main/java/aws/example/helloswf/目錄中的 中建立 檔案。

  2. package宣告新增至每個檔案的開頭,以宣告其命名空間。範例專案使用:

    package aws.example.helloswf;
  3. 新增 AmazonSimpleWorkflowClient 類別和 com.amazonaws.services.simpleworkflow.model 命名空間中多個類別的import宣告。為了簡化物件,我們將使用:

    import com.amazonaws.regions.Regions; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClientBuilder; import com.amazonaws.services.simpleworkflow.model.*;

註冊網域、工作流程和活動類型

首先,我們會建立新的可執行檔類別 HelloTypes.java。此檔案將包含工作流程不同部分需要知道的共用資料,例如活動的名稱和版本,以及工作流程類型、網域名稱和任務清單名稱。

  1. 開啟文字編輯器並建立檔案 HelloTypes.java,根據常見步驟新增套件宣告和匯入。

  2. 宣告 HelloTypes類別,並提供用於已註冊活動和工作流程類型的值:

    public static final String DOMAIN = "HelloDomain"; public static final String TASKLIST = "HelloTasklist"; public static final String WORKFLOW = "HelloWorkflow"; public static final String WORKFLOW_VERSION = "1.0"; public static final String ACTIVITY = "HelloActivity"; public static final String ACTIVITY_VERSION = "1.0";

    這些值將在整個程式碼中使用。

  3. 在字串宣告之後,建立 AmazonSimpleWorkflowClient 類別的執行個體。這是 所提供 Amazon SWF 方法的基本界面 AWS SDK for Java。

    private static final AmazonSimpleWorkflow swf = AmazonSimpleWorkflowClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();

    上一個程式碼片段假設暫時登入資料與default設定檔相關聯。如果您使用不同的設定檔,請修改上述程式碼,如下所示,並將 profile_name 取代為實際的設定檔名稱。

    private static final AmazonSimpleWorkflow swf = AmazonSimpleWorkflowClientBuilder .standard() .withCredentials(new ProfileCredentialsProvider("profile_name")) .withRegion(Regions.DEFAULT_REGION) .build();
  4. 新增函數以註冊 SWF 網域。網域是許多相關 SWF 活動和工作流程類型的邏輯容器。SWF 元件只能在相同網域中存在時互相通訊。

    try { System.out.println("** Registering the domain '" + DOMAIN + "'."); swf.registerDomain(new RegisterDomainRequest() .withName(DOMAIN) .withWorkflowExecutionRetentionPeriodInDays("1")); } catch (DomainAlreadyExistsException e) { System.out.println("** Domain already exists!"); }

    註冊網域時,您會提供名稱 (一組 1 到 256 個字元,不包括 :/|、控制字元或常值字串 '`arn') 和保留期間,這是工作流程執行完成後 Amazon SWF ,工作流程執行歷史記錄資料的保留天數。工作流程執行保留期上限為 90 天。如需詳細資訊,請參閱 RegisterDomainRequest

    如果具有該名稱的網域已存在,則會引發 DomainAlreadyExistsException。由於我們未考量網域是否已建立,因此可以忽略例外狀況。

    注意

    此程式碼示範使用 AWS SDK for Java 方法時的常見模式,方法的資料是由 simpleworkflow.model 命名空間中的類別提供,您可以使用可鏈結–0—with*的方法執行個體化和填入。

  5. 新增函數以註冊新的活動類型。活動代表工作流程中的工作單位。

    try { System.out.println("** Registering the activity type '" + ACTIVITY + "-" + ACTIVITY_VERSION + "'."); swf.registerActivityType(new RegisterActivityTypeRequest() .withDomain(DOMAIN) .withName(ACTIVITY) .withVersion(ACTIVITY_VERSION) .withDefaultTaskList(new TaskList().withName(TASKLIST)) .withDefaultTaskScheduleToStartTimeout("30") .withDefaultTaskStartToCloseTimeout("600") .withDefaultTaskScheduleToCloseTimeout("630") .withDefaultTaskHeartbeatTimeout("10")); } catch (TypeAlreadyExistsException e) { System.out.println("** Activity type already exists!"); }

    活動類型由名稱版本識別,用於唯一識別其註冊網域中任何其他人的活動。活動也包含許多選用參數,例如用於從 SWF 接收任務和資料的預設任務清單,以及可用於限制活動執行不同部分需要多長時間的不同逾時。如需詳細資訊,請參閱 RegisterActivityTypeRequest

如果您嘗試註冊的活動類型已存在,則會引發 TypeAlreadyExistsException。新增 函數以註冊新的工作流程類型。工作流程也稱為決策者,代表工作流程執行的邏輯。

+

try { System.out.println("** Registering the workflow type '" + WORKFLOW + "-" + WORKFLOW_VERSION + "'."); swf.registerWorkflowType(new RegisterWorkflowTypeRequest() .withDomain(DOMAIN) .withName(WORKFLOW) .withVersion(WORKFLOW_VERSION) .withDefaultChildPolicy(ChildPolicy.TERMINATE) .withDefaultTaskList(new TaskList().withName(TASKLIST)) .withDefaultTaskStartToCloseTimeout("30")); } catch (TypeAlreadyExistsException e) { System.out.println("** Workflow type already exists!"); }

+

與活動類型類似,工作流程類型會依名稱版本識別,並具有可設定的逾時。如需詳細資訊,請參閱 RegisterWorkflowTypeRequest

+

如果您嘗試註冊的工作流程類型已存在,則會引發 TypeAlreadyExistsException。最後,提供 main方法讓類別可執行,進而註冊網域、活動類型和工作流程類型:

+

registerDomain(); registerWorkflowType(); registerActivityType();

您可以立即建置執行應用程式以執行註冊指令碼,或繼續編碼活動和工作流程工作者。網域、工作流程和活動註冊完成後,就不需要再次執行此操作,這些類型會持續存在,直到您自行棄用它們為止。

實作活動工作者

活動是工作流程中的基本工作單位。工作流程提供邏輯、排程要執行的活動 (或其他要採取的動作) 以回應決策任務。典型的工作流程通常包含許多可以同步、非同步或兩者組合執行的活動。

活動工作者是輪詢 為 Amazon SWF 回應工作流程決策而產生之活動任務的程式碼位元。收到活動任務時,它會執行對應的活動,並將成功/失敗回應傳回工作流程。

我們將實作簡單的活動工作者,以推動單一活動。

  1. 開啟您的文字編輯器並建立檔案 ActivityWorker.java,根據常見步驟新增套件宣告和匯入。

    import com.amazonaws.regions.Regions; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClientBuilder; import com.amazonaws.services.simpleworkflow.model.*;
  2. ActivityWorker類別新增至 檔案,並為其提供資料成員,以保留我們將用來與之互動的 SWF 用戶端 Amazon SWF:

    private static final AmazonSimpleWorkflow swf = AmazonSimpleWorkflowClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
  3. 新增我們將用作活動的方法:

    private static String sayHello(String input) throws Throwable { return "Hello, " + input + "!"; }

    活動只需要一個字串,將其合併為問候語並傳回結果。雖然此活動不太可能引發例外狀況,但最好設計活動,以便在發生錯誤時引發錯誤。

  4. 新增main我們將用作活動任務輪詢方法的方法。我們會新增一些程式碼來輪詢活動任務的任務清單,以開始執行此作業:

    System.out.println("Polling for an activity task from the tasklist '" + HelloTypes.TASKLIST + "' in the domain '" + HelloTypes.DOMAIN + "'."); ActivityTask task = swf.pollForActivityTask( new PollForActivityTaskRequest() .withDomain(HelloTypes.DOMAIN) .withTaskList( new TaskList().withName(HelloTypes.TASKLIST))); String task_token = task.getTaskToken();

    活動 Amazon SWF 透過呼叫 SWF 用戶端的 pollForActivityTask方法接收來自 的任務,指定要在傳入 PollForActivityTaskRequest 中使用的網域和任務清單。

    收到任務後,我們會呼叫任務的 getTaskToken方法來擷取其唯一識別符。

  5. 接著,撰寫一些程式碼來處理進來的任務。在輪詢任務並擷取其任務字符的程式碼之後,立即將以下內容新增至您的main方法。

    if (task_token != null) { String result = null; Throwable error = null; try { System.out.println("Executing the activity task with input '" + task.getInput() + "'."); result = sayHello(task.getInput()); } catch (Throwable th) { error = th; } if (error == null) { System.out.println("The activity task succeeded with result '" + result + "'."); swf.respondActivityTaskCompleted( new RespondActivityTaskCompletedRequest() .withTaskToken(task_token) .withResult(result)); } else { System.out.println("The activity task failed with the error '" + error.getClass().getSimpleName() + "'."); swf.respondActivityTaskFailed( new RespondActivityTaskFailedRequest() .withTaskToken(task_token) .withReason(error.getClass().getSimpleName()) .withDetails(error.getMessage())); } }

    如果任務字符不是 null,我們可以開始執行活動方法 (sayHello),提供它與任務一起傳送的輸入資料。

    如果任務成功 (未產生錯誤),則工作者會使用包含任務字符和活動結果資料的 RespondActivityTaskCompletedRequest 物件呼叫 SWF 用戶端的 respondActivityTaskCompleted方法來回應 SWF。

    另一方面,如果任務失敗,我們會透過使用 RespondActivityTaskFailedRequest 物件呼叫 respondActivityTaskFailed方法,將任務權杖和錯誤的相關資訊傳遞給它來回應。

注意

如果終止,此活動將不會正常關閉。雖然它超出本教學課程的範圍,但此活動工作者的替代實作會在隨附的主題中提供,即關閉活動和工作流程工作者 Gracefully

實作工作流程工作者

您的工作流程邏輯位於稱為工作流程工作者的程式碼中。工作流程工作者會輪詢網域 Amazon SWF 中由 傳送的決策任務,以及在預設任務清單上註冊工作流程類型的決策任務。

當工作流程工作者收到任務時,會做出某種決策 (通常是是否排程新活動),並採取適當的動作 (例如排程活動)。

  1. 開啟文字編輯器並建立檔案 WorkflowWorker.java,根據常見步驟新增套件宣告和匯入。

  2. 將一些額外的匯入新增至 檔案:

    import com.amazonaws.regions.Regions; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClientBuilder; import com.amazonaws.services.simpleworkflow.model.*; import java.util.ArrayList; import java.util.List; import java.util.UUID;
  3. 宣告 WorkflowWorker類別,並建立用於存取 SWF 方法的 AmazonSimpleWorkflowClient 類別執行個體。

    private static final AmazonSimpleWorkflow swf = AmazonSimpleWorkflowClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
  4. 新增 main方法。方法會持續循環,使用 SWF 用戶端的 pollForDecisionTask方法輪詢決策任務。PollForDecisionTaskRequest 提供詳細資訊。

    PollForDecisionTaskRequest task_request = new PollForDecisionTaskRequest() .withDomain(HelloTypes.DOMAIN) .withTaskList(new TaskList().withName(HelloTypes.TASKLIST)); while (true) { System.out.println( "Polling for a decision task from the tasklist '" + HelloTypes.TASKLIST + "' in the domain '" + HelloTypes.DOMAIN + "'."); DecisionTask task = swf.pollForDecisionTask(task_request); String taskToken = task.getTaskToken(); if (taskToken != null) { try { executeDecisionTask(taskToken, task.getEvents()); } catch (Throwable th) { th.printStackTrace(); } } }

    一旦收到任務,我們就會呼叫其getTaskToken方法,傳回可用來識別任務的字串。如果傳回的字符不是 null,我們會在 executeDecisionTask方法中進一步處理它,並傳遞任務字符和隨任務傳送的 HistoryEvent 物件清單。

  5. 新增 executeDecisionTask方法,取得任務字符 (String) 和 HistoryEvent清單。

    List<Decision> decisions = new ArrayList<Decision>(); String workflow_input = null; int scheduled_activities = 0; int open_activities = 0; boolean activity_completed = false; String result = null;

    我們也設定一些資料成員來追蹤下列項目:

    • 用於報告處理任務結果的決策物件清單。

    • 保留「WorkflowExecutionStarted」事件提供之工作流程輸入的字串

    • 排程和開啟 (執行中) 活動的計數,以避免在已排程或目前正在執行時排程相同的活動。

    • 布林值,表示活動已完成。

    • 保留活動結果的字串,用於將其作為我們的工作流程結果傳回。

  6. 接下來,新增一些程式碼到 executeDecisionTask ,根據 getEventType方法報告的事件類型,處理與任務一起傳送的HistoryEvent物件。

    System.out.println("Executing the decision task for the history events: ["); for (HistoryEvent event : events) { System.out.println(" " + event); switch(event.getEventType()) { case "WorkflowExecutionStarted": workflow_input = event.getWorkflowExecutionStartedEventAttributes() .getInput(); break; case "ActivityTaskScheduled": scheduled_activities++; break; case "ScheduleActivityTaskFailed": scheduled_activities--; break; case "ActivityTaskStarted": scheduled_activities--; open_activities++; break; case "ActivityTaskCompleted": open_activities--; activity_completed = true; result = event.getActivityTaskCompletedEventAttributes() .getResult(); break; case "ActivityTaskFailed": open_activities--; break; case "ActivityTaskTimedOut": open_activities--; break; } } System.out.println("]");

    基於工作流程的目的,我們最感興趣的是:

    • 「WorkflowExecutionStarted」事件,表示工作流程執行已開始 (通常表示您應該在工作流程中執行第一個活動),並提供提供給工作流程的初始輸入。在這種情況下,它是我們問候語的名稱部分,因此會儲存在字串中,以便在排程要執行的活動時使用。

    • 「ActivityTaskCompleted」事件,會在排程活動完成後傳送。事件資料也包含已完成活動的傳回值。由於我們只有一個活動,我們將使用該值作為整個工作流程的結果。

    如果您的工作流程需要,則可以使用其他事件類型。如需每個事件類型的相關資訊,請參閱 HistoryEvent 類別描述。

    + 注意:Java 7 中引入switch了陳述式中的字串。如果您使用的是舊版 Java,則可以使用 EventType 類別,將 String傳回的 history_event.getType() 轉換為列舉值,然後String視需要返回 :

EventType et = EventType.fromValue(event.getEventType());
  1. switch陳述式之後,新增更多程式碼,根據收到的任務做出適當的決策來回應。

    if (activity_completed) { decisions.add( new Decision() .withDecisionType(DecisionType.CompleteWorkflowExecution) .withCompleteWorkflowExecutionDecisionAttributes( new CompleteWorkflowExecutionDecisionAttributes() .withResult(result))); } else { if (open_activities == 0 && scheduled_activities == 0) { ScheduleActivityTaskDecisionAttributes attrs = new ScheduleActivityTaskDecisionAttributes() .withActivityType(new ActivityType() .withName(HelloTypes.ACTIVITY) .withVersion(HelloTypes.ACTIVITY_VERSION)) .withActivityId(UUID.randomUUID().toString()) .withInput(workflow_input); decisions.add( new Decision() .withDecisionType(DecisionType.ScheduleActivityTask) .withScheduleActivityTaskDecisionAttributes(attrs)); } else { // an instance of HelloActivity is already scheduled or running. Do nothing, another // task will be scheduled once the activity completes, fails or times out } } System.out.println("Exiting the decision task with the decisions " + decisions);
    • 如果活動尚未排程,我們會回應決策,該ScheduleActivityTask決策會在 ScheduleActivityTaskDecisionAttributes 結構中提供 Amazon SWF 後續排程活動的相關資訊,也包括 Amazon SWF 應傳送至活動的任何資料。

    • 如果活動已完成,我們將整個工作流程視為已完成,並以CompletedWorkflowExecution決策回應,填寫 CompleteWorkflowExecutionDecisionAttributes 結構,以提供已完成工作流程的詳細資訊。在這種情況下,我們會傳回活動的結果。

    無論哪種情況,決策資訊都會新增至方法頂端宣告的Decision清單。

  2. 傳回處理任務時收集的Decision物件清單,以完成決策任務。在我們撰寫executeDecisionTask的方法結尾新增此程式碼:

    swf.respondDecisionTaskCompleted( new RespondDecisionTaskCompletedRequest() .withTaskToken(taskToken) .withDecisions(decisions));

    SWF 用戶端的 respondDecisionTaskCompleted方法會取得識別任務的任務字符,以及Decision物件清單。

實作工作流程啟動者

最後,我們將編寫一些程式碼來開始工作流程執行。

  1. 開啟文字編輯器並建立檔案 WorkflowStarter.java,根據常見步驟新增套件宣告和匯入。

  2. 新增 WorkflowStarter類別:

    package aws.example.helloswf; import com.amazonaws.regions.Regions; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClientBuilder; import com.amazonaws.services.simpleworkflow.model.*; public class WorkflowStarter { private static final AmazonSimpleWorkflow swf = AmazonSimpleWorkflowClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build(); public static final String WORKFLOW_EXECUTION = "HelloWorldWorkflowExecution"; public static void main(String[] args) { String workflow_input = "{SWF}"; if (args.length > 0) { workflow_input = args[0]; } System.out.println("Starting the workflow execution '" + WORKFLOW_EXECUTION + "' with input '" + workflow_input + "'."); WorkflowType wf_type = new WorkflowType() .withName(HelloTypes.WORKFLOW) .withVersion(HelloTypes.WORKFLOW_VERSION); Run run = swf.startWorkflowExecution(new StartWorkflowExecutionRequest() .withDomain(HelloTypes.DOMAIN) .withWorkflowType(wf_type) .withWorkflowId(WORKFLOW_EXECUTION) .withInput(workflow_input) .withExecutionStartToCloseTimeout("90")); System.out.println("Workflow execution started with the run id '" + run.getRunId() + "'."); } }

    WorkflowStarter 類別由單一方法 組成main,採用在命令列上傳遞的選用引數做為工作流程的輸入資料。

    SWF 用戶端方法 startWorkflowExecution採用 StartWorkflowExecutionRequest 物件做為輸入。在這裡,除了指定要執行的網域和工作流程類型之外,我們還提供它:

    • 人類可讀取的工作流程執行名稱

    • 工作流程輸入資料 (在範例中的命令列提供)

    • 逾時值,代表整個工作流程執行所需的時間,以秒為單位。

    startWorkflowExecution 傳回的執行物件提供執行 ID,此值可用來識別工作流程執行 Amazon SWF歷史記錄中的此特定工作流程執行。

    + 注意:執行 ID 是由 產生 Amazon SWF,與您在啟動工作流程執行時傳入的工作流程執行名稱不同

建置範例

若要使用 Maven 建置範例專案,請前往 helloswf目錄並輸入:

mvn package

產生的 helloswf-1.0.jar會在 target目錄中產生。

執行範例

此範例包含四個獨立的可執行檔類別,彼此獨立執行。

注意

如果您使用的是 Linux、macOS 或 Unix 系統,您可以在單一終端機視窗中逐一執行所有系統。如果您執行 Windows,您應該開啟兩個額外的命令列執行個體,並導覽至每個執行個體中的helloswf目錄。

設定 Java classpath

雖然 Maven 已為您處理相依性,但若要執行範例,您需要在 Java classpath 上提供 AWS SDK 程式庫及其相依性。您可以將CLASSPATH環境變數設定為 AWS SDK 程式庫的位置和 SDK 中的third-party/lib目錄,其中包括必要的相依性:

export CLASSPATH='target/helloswf-1.0.jar:/path/to/sdk/lib/*:/path/to/sdk/third-party/lib/*' java example.swf.hello.HelloTypes

或使用 java 命令-cp的選項,在執行每個應用程式時設定 classpath。

java -cp target/helloswf-1.0.jar:/path/to/sdk/lib/*:/path/to/sdk/third-party/lib/* \ example.swf.hello.HelloTypes

您使用的樣式由您決定。如果您在建置程式碼時沒有問題,則嘗試執行範例並取得一系列的 "NoClassDefFound" 錯誤,這可能是因為 classpath 設定不正確。

註冊網域、工作流程和活動類型

在執行工作者和工作流程啟動者之前,您需要註冊網域以及工作流程和活動類型。要執行此操作的程式碼是在註冊網域工作流程和活動類型中實作。

建置之後,如果您已設定 CLASSPATH,您可以執行 命令來執行註冊碼:

echo 'Supply the name of one of the example classes as an argument.'

啟動活動和工作流程工作者

現在類型已註冊,您可以啟動活動和工作流程工作者。這些任務將繼續執行並輪詢任務,直到它們被刪除,因此您應該在單獨的終端視窗中執行它們,或者,如果您在 Linux、macOS 或 Unix 上執行,您可以使用 &運算子在執行時使它們產生單獨的程序。

echo 'If there are arguments to the class, put them in quotes after the class name.' exit 1

如果您在不同的視窗中執行這些命令,請省略每行的最終&運算子。

啟動工作流程執行

現在您的活動和工作流程工作者正在輪詢,您可以開始工作流程執行。此程序將執行,直到工作流程傳回完成的狀態。您應該在新的終端機視窗中執行它 (除非您使用 &運算子,將工作者執行為新產生的程序)。

fi
注意

如果您想要提供自己的輸入資料,這些資料會先傳遞至工作流程,然後再傳遞至活動,請將其新增至命令列。例如:

echo "## Running $className..."

開始工作流程執行後,您應該會開始看到工作者和工作流程執行本身交付的輸出。當工作流程最終完成時,其輸出將列印到螢幕。

此範例的完整來源

您可以在 aws-java-developer-guide 儲存庫的 Github 上瀏覽此範例的完整來源

如需詳細資訊