View a markdown version of this page

HelloWorldWorkflowParallel 應用程式 - AWS Flow Framework 適用於 Java 的

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

HelloWorldWorkflowParallel 應用程式

先前的 Hello World! 版本皆使用線性工作流程拓撲。不過,Amazon SWF 不限於線性拓撲。HelloWorldWorkflowParallel 應用程式即為 HelloWorldWorkflow 的修改版本,使用平行拓撲,如下圖所示。

HelloWorldWorkflowParallel 工作流程拓撲

使用 HelloWorldWorkflowParallel,getName 和 getGreeting 會平行執行問候語的每個傳回部分。say 接著會將兩個字串合併到問候語,並將之列印至主控台。

若要實作應用程式,請在您的專案目錄中建立 helloWorld.HelloWorldWorkflow 套件的副本,並命名為 helloWorld.HelloWorldWorkflowParallel。下列各節說明如何修改原始 HelloWorldWorkflow 程式碼以平行執行 getName 和 getGreeting。

HelloWorldWorkflowParallel 活動工作者

HelloWorldWorkflowParallel 活動界面在 GreeterActivities 中實作,如下列範例所示。

import com.amazonaws.services.simpleworkflow.flow.annotations.Activities; import com.amazonaws.services.simpleworkflow.flow.annotations.ActivityRegistrationOptions; @Activities(version="5.0") @ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 300, defaultTaskStartToCloseTimeoutSeconds = 10) public interface GreeterActivities { public String getName(); public String getGreeting(); public void say(String greeting, String name); }

此界面與 HelloWorldWorkflow 類似,例外狀況如下:

  • getGreeting 不會採用任何輸入;只會傳回問候語字串。

  • say 採用兩個輸入字串:問候語和名稱。

  • 界面具有新的版本編號,在您變更已註冊的界面時會需要。

HelloWorldWorkflowParallel 會實作 GreeterActivitiesImpl 中的活動,如下所示:

public class GreeterActivitiesImpl implements GreeterActivities { @Override public String getName() { return "World!"; } @Override public String getGreeting() { return "Hello "; } @Override public void say(String greeting, String name) { System.out.println(greeting + name); } }

getName 和 getGreeting 現在只會傳回一半的問候語字串。say 會串連兩個部分來產生完整片語,並將之列印至主控台。

HelloWorldWorkflowParallel 工作流程工作者

HelloWorldWorkflowParallel 工作流程界面在 GreeterWorkflow 中實作,如下所示:

import com.amazonaws.services.simpleworkflow.flow.annotations.Execute; import com.amazonaws.services.simpleworkflow.flow.annotations.Workflow; import com.amazonaws.services.simpleworkflow.flow.annotations.WorkflowRegistrationOptions; @Workflow @WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 3600) public interface GreeterWorkflow { @Execute(version = "5.0") public void greet(); }

類別與 HelloWorldWorkflow 版本相同,差別在於版本編號已為符合活動工作者而變更。

工作流程在 GreeterWorkflowImpl 中實作,如下所示:

import com.amazonaws.services.simpleworkflow.flow.core.Promise; public class GreeterWorkflowImpl implements GreeterWorkflow { private GreeterActivitiesClient operations = new GreeterActivitiesClientImpl(); public void greet() { Promise<String> name = operations.getName(); Promise<String> greeting = operations.getGreeting(); operations.say(greeting, name); } }

概述而言,此實作與 HelloWorldWorkflow 十分類似;這三個活動用戶端方法會循序執行。不過,活動不同。

  • HelloWorldWorkflow 將 name 傳遞給 getGreeting。因為 name 是 Promise<T> 物件,所以 getGreeting 延遲執行活動,直到 getName 完成,因此這兩個活動會循序執行。

  • HelloWorldWorkflowParallel 不會傳遞任何輸入 getName 或 getGreeting。任一種方法都不會延遲執行,而且會立即平行執行相關聯的活動方法。

say 活動會採用 greeting 和 name 做為輸入參數。因為它們是 Promise<T> 物件,所以 say 會延遲執行,直到兩個活動完成,然後建構和列印問候語。

請注意,HelloWorldWorkflowParallel 不會使用任何特殊模型程式碼來定義工作流程拓撲。它透過使用標準 Java 流程控制並利用 Promise<T> 物件的屬性來隱含地執行此操作。 AWS Flow Framework 對於 Java 應用程式,只需搭配傳統 Java 控制流程建構使用Promise<T>物件,即可實作甚至複雜的拓撲。

HelloWorldWorkflowParallel 工作流程和活動主機與啟動者

HelloWorldWorkflowParallel 將 GreeterWorker 實作為工作流程和活動實作的主機類別。它與 HelloWorldWorkflow 實作相同,差別在於 taskListToPoll 名稱設為 "HelloWorldParallelList"。

HelloWorldWorkflowParallel 會在 GreeterMain 中實作工作流程啟動者,而且與 HelloWorldWorkflow 實作相同。

若要執行工作流程,請執行 GreeterWorker 和 GreeterMain,如同 HelloWorldWorkflow。