HelloWorldWorkflow 應用 - AWS Flow Framework 對於爪哇

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

HelloWorldWorkflow 應用

雖然基本HelloWorld範例的結構類似於工作流程,但它與 Amazon SWF 工作流程在幾個關鍵方面有所不同:

傳統和 Amazon SWF 工作流程應用程式
HelloWorld Amazon SWF 工作流
以單一程序在本機執行。 以多個程序的形式執行,可分散在多個系統上,包括 Amazon EC2 執行個體、私有資料中心、用戶端電腦等。甚至不必執行相同的作業系統。
活動為同步的方法,完成後才予以解鎖。 活動由非同步方法代表,其會立即傳回,並於等待活動完成期間,允許工作流程執行其他任務。
工作流程工作者透過呼叫合適的方法與活動工作者互動。 工作流程工作者透過使用 HTTP 請求與活動工作者互動,而 Amazon SWF 則充當中介。
工作流程啟動者透過呼叫合適的方法與工作流程工作者互動。 工作流程開始程式會使用 HTTP 請求與工作流程工作者互動,而 Amazon SWF 則充當中介。

您可以從頭開始實作分散式非同步工作流程應用程式,例如讓您的工作流程工作者透過 Web 服務呼叫,直接與活動工作者互動。但是,您必須接著實作所有必要的複雜程式碼,藉以管理多項活動的非同步執行、處理資料流程等。對 AWS Flow Framework 於 Java 和 Amazon SWF 處理所有這些細節,這使您可以專注於實現業務邏輯。

HelloWorldWorkflow 是以 Amazon SWF 工作流 HelloWorld 程執行的修改版本。下圖摘要說明這兩個應用程式的運作方式。

你好世界的傳統和 Amazon SWF 版本!

HelloWorld 以單一處理序的方式執行,啟動器、工作流程 Worker 和活動 Worker 會使用傳統方法呼叫進行互動。使用起動器HelloWorldWorkflow、工作流程工作者和活動工作者是分散式元件,可透過 Amazon SWF 使用 HTTP 請求進行互動。Amazon SWF 會維護工作流程和活動任務的清單來管理互動,這些工作流程和活動任務會傳送到各自的元件。本節介紹框架的工作原理 HelloWorldWorkflow。

HelloWorldWorkflow 是透過使用 Java API 來實作,該 AWS Flow Framework API 會處理在背景中與 Amazon SWF 互動的有時複雜詳細資訊,並大幅簡化開發程序。您可以使用您為其執行的相同專案 HelloWorld,該專案已針對 Java 應用程式 AWS Flow Framework 進行配置。不過,若要執行應用程式,您必須設定 Amazon SWF 帳戶,如下所示:

  • 註冊一個 AWS 帳戶,如果你還沒有一個,在 Amazon Web Services

  • 將您帳戶的存取 ID 和密鑰 ID 分別指派給 AWS_ACCESS_KEY_ID 和 AWS_SECRET_KEY 環境變數。這是不在程式碼中公開文字金鑰值的良好做法。將之存放在環境變數中會是處理此問題的便利方法。

  • 在 Amazon 簡單工作流服務上註冊 Amazon SWF 帳戶。

  • 登錄 AWS Management Console 並選擇 Amazon SWF 服務。

  • 選擇右上角的「管理網域」,然後註冊新的 Amazon SWF 網域。「網域」是應用程式資源的邏輯容器,例如工作流程和活動類型及工作流程執行。您可以使用任何方便的域名,但演練使用「」helloWorldWalkthrough。

若要實作 HelloWorldWorkflow,請建立 HelloWorld 的副本。 HelloWorld 在您的項目目錄中打包並將其命名為 HelloWorld。 HelloWorldWorkflow。以下各節說明如何修改原始程式 HelloWorld碼,以便使用適用 AWS Flow Framework 於 Java,並以 Amazon SWF 工作流程應用程式的形式執行。

HelloWorldWorkflow 活動工作者

HelloWorld 將其活動工作者實現為單個類。一 AWS Flow Framework 個 Java 活動工作者有三個基本組成部分:

  • 活動方法-其中執行實際的任務-在接口中定義,並在相關類中實現。

  • ActivityWorker類別會管理活動方法與 Amazon SWF 之間的互動。

  • 「活動主機」應用程式會註冊活動工作者並予以啟動,且會處理清理。

本節將討論活動方法,其他兩個類別待後文討論。

HelloWorldWorkflow 定義中的活動介面GreeterActivities,如下所示:

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

這個接口並不是絕對必要的 HelloWorld,但它適用 AWS Flow Framework 於 Java 應用程序。請注意,界面定義本身並未變更。但是,您必須將兩個應用 AWS Flow Framework 於 Java 註釋@Activities@ActivityRegistrationOptions並且應用於接口定義。註釋提供了配置信息,並指示 AWS Flow Framework Java 註釋處理器使用接口定義來生成活動客戶端類,這將在後面討論。

@ActivityRegistrationOptions具有數個用於配置活動行為的具名值。 HelloWorldWorkflow 指定兩個超時:

  • defaultTaskScheduleToStartTimeoutSeconds 指定任務在活動任務清單中排入佇列的時間,設為 300 秒 (5 分鐘)。

  • defaultTaskStartToCloseTimeoutSeconds 指定活動執行任務可使用的時間上限,設為 10 秒。

這些逾時確保活動在合理的時間內完成其任務。如果超過任一種逾時,框架會產生錯誤,而工作流程工作者必須決定如何處理此問題。若需如何處理這類錯誤的討論,請參閱「錯誤處理」。

@Activities 有數個值,但通常僅指出活動的版本編號,能夠讓您追蹤所產生的不同活動實作。如果您在 Amazon SWF 註冊活動界面後變更活動界面 (包括變更@ActivityRegistrationOptions值),則必須使用新的版本號碼。

HelloWorldWorkflow 實作中的活動方法GreeterActivitiesImpl,如下所示:

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

請注意,程式碼與 HelloWorld 實作相同。在其核心,一個 AWS Flow Framework 活動只是一個執行一些代碼並可能返回結果的方法。標準應用程式和 Amazon SWF 工作流程應用程式之間的差異在於工作流程執行活動的方式、執行活動的位置,以及將結果傳回給工作流程背景工作者的方式。

HelloWorldWorkflow 工作流工作

Amazon SWF 工作流程工作程式有三個基本元件。

  • 「工作流程實作」類別,會執行工作流程相關的任務。

  • 「活動用戶端」類別,基本上為活動類別的代理,而工作流程實作會用以非同步執行活動方法。

  • 管理工作流程與 Amazon SWF 之間互動的WorkflowWorker類別。

本節討論工作流程實作和活動用戶端,WorkflowWorker 類別留待後文討論。

HelloWorldWorkflow 定義中的工作流程介面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 = "1.0") public void greet(); }

這個接口也不是絕對必要的, HelloWorld 但對於 Java 應用程序來 AWS Flow Framework 說是必不可少的。您必須將兩 AWS Flow Framework 個 Java 註釋套用至工作流程介面定義。@工作流程 @WorkflowRegistrationOptions註釋提供了配置信息,並且還指示 AWS Flow Framework Java 註釋處理器根據接口生成工作流程客戶端類別,如稍後所討論。

@Workflow有一個選擇性參數 DataConverter,通常會與預設值搭配使用 NullDataConverter,表示應該使用 JsonDataConverter 該參數。

@WorkflowRegistrationOptions 也有數個選擇性參數,可用以設定工作流程工作者。在這裡,我們將defaultExecutionStartToCloseTimeoutSeconds指定工作流程可以執行的時間長度設定為 3600 秒 (1 小時)。

GreeterWorkflow介面定義與@Execute註解 HelloWorld 的重要方式有所不同。工作流程界面指定可由應用程式呼叫的方法 (例如工作流程啟動者),並限定在少數幾個方法,各有特定的角色。架構不會指定工作流程介面方法的名稱或參數清單;您可以使用適合您工作流程的名稱和參數清單,並套 AWS Flow Framework 用 For Java 註解來識別方法的角色。

@Execute 有兩個用途:

  • greet 識別為工作流程的進入點,即為工作流程啟動者呼叫以啟動工作流程的方法。一般而言,進入點可採用一或多個參數,讓啟動者初始化工作流程,但此範例不需要初始化。

  • 指出工作流程的版本編號,能夠讓您追蹤所產生的不同工作流程實作。若要在 Amazon SWF 註冊工作流程界面 (包括變更逾時值) 之後變更工作流程界面,您必須使用新的版本號碼。

如需可包含在工作流程界面中之其他方法的資訊,請參閱「工作流程和活動合約」。

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(name); operations.say(greeting); } }

代碼類似於 HelloWorld,但有兩個重要的差異。

  • GreeterWorkflowImpl 建立 GreeterActivitiesClientImpl 的執行個體 (活動用戶端),不是 GreeterActivitiesImpl 的執行個體,並在用戶端物件上呼叫方法來執行活動。

  • 名稱和歡迎活動傳回 Promise<String> 物件,不是 String 物件。

HelloWorld 是以單一處理序在本機執行的標準 Java 應用程式,因此GreeterWorkflowImpl只要建立的執行個體、依序呼叫方法GreeterActivitiesImpl,然後將傳回值從一個活動傳送到下一個活動,即可實作工作流程拓撲。使用 Amazon SWF 工作流程時,活動的任務仍然會由中的活動方法執行GreeterActivitiesImpl。不過,方法不一定會在和工作流程相同的程序中執行 (甚至可能不在同一個系統中執行),且工作流程需非同步執行活動。這些要求會引起下列問題:

  • 如何執行可能在不同程序,甚或是不同系統中執行的活動方法。

  • 如何非同步執行活動方法。

  • 如何管理活動的輸入和傳回值。例如,如果活動 A 的傳回值是活動 B 的輸入,您必須確保活動 B 不會在活動 A 完成前執行。

您可以使用熟悉的 Java 流程控制,結合活動用戶端與 Promise<T>,藉由應用程式的控制流程,實作各種工作流程拓撲。

活動用戶端

GreeterActivitiesClientImpl 基本上是 GreeterActivitiesImpl 的代理,允許工作流程實作非同步執行 GreeterActivitiesImpl 方法。

GreeterActivitiesClientGreeterActivitiesClientImpl 類別會使用套用到您 GreeterActivities 類別之註釋中提供的資訊,自動為您產生。您無須自行實作。

注意

Eclipse 會在您儲存專案時產生這些類別。您可在您專案目錄的 .apt_generated 子目錄中檢視所產生的程式碼。

若要避免GreeterWorkflowImpl類別中發生編譯錯誤,最好將.apt_generated目錄移至「Java 建置路徑」對話方塊的「順序和匯出」索引標籤頂端。

工作流程工作者透過呼叫對應的用戶端方法執行活動。方法是非同步的,並會立即傳回 Promise<T> 物件,其中 T 是活動的傳回類型。傳回的 Promise<T> 物件基本上是活動方法最終傳回值的預留位置。

  • 當活動用戶端方法傳回時,Promise<T> 物件一開始是「未就緒狀態」,表示物件尚未能代表有效的傳回值。

  • 當對應的活動方法完成其任務並傳回之後,框架會將傳回值指派給 Promise<T> 物件,讓物件進入「就緒狀態」

Promise<T> 類型

Promise<T> 物件的主要用途為管理非同步元件間的資料流程,並控制其執行的時機。此物件讓您的應用程式不必明確管理同步,或依賴計時器等機制確保非同步元件不提前執行。當您呼叫活動用戶端方法時,其會立即傳回,但框架會延遲執行對應的活動方法,直到任何輸入 Promise<T> 物件就緒且代表有效的資料為止。

GreeterWorkflowImpl 而言,這三個活動用戶端方法都會立即傳回。就 GreeterActivitiesImpl 而言,框架在 name 完成前不會呼叫 getGreeting,在 getGreeting 完成前不會呼叫 say

使用 Promise<T> 將資料從一項活動傳遞到下一項活動,HelloWorldWorkflow 不僅能確保活動方法不嘗試使用無效的資料,還能控制何時執行活動及暗示定義工作流程拓撲。將每項活動的 Promise<T> 傳回值傳遞到下一項活動,需要活動依序執行,定義前文討論過的線性拓撲。 AWS Flow Framework 對於 Java,您不需要使用任何特殊的建模代碼來定義甚至複雜的拓撲,只需標準的 Java 流程控制和Promise<T>. 如需如何實作簡易平行拓撲的範例,請參閱「HelloWorldWorkflowParallel 活動工作者」。

注意

say 等活動方法不傳回值時,對應的用戶端方法會傳回 Promise<Void> 物件。物件不代表資料,但其在一開始時未就緒,在活動完成時即變為就緒。因此,您可將 Promise<Void> 物件傳遞到其他活動用戶端方法,確保其在原始活動完成前延遲執行。

Promise<T> 允許工作流程實作使用活動用戶端方法及傳回值,近似於同步方法。不過,您必須謹慎存取 Promise<T> 物件的值。不像 Java Future<T> 類型,框架會處理 Promise<T> 的同步,而非應用程式同步。如果您呼叫 Promise<T>.get,而且物件未就緒,則 get 會拋出例外狀況。請注意,HelloWorldWorkflow 從不直接存取 Promise<T> 物件,而只會將物件從一項活動傳遞到下一項活動。當物件變成就緒後,框架會擷取值並將之以標準類型傳遞到活動方法。

Promise<T> 物件應僅由非同步程式碼存取,其中框架保證非同步程式碼的物件已就緒且代表有效值。HelloWorldWorkflow 只將 Promise<T> 物件傳遞給活動用戶端方法,藉以處理此問題。您可以在工作流程實作中存取Promise<T>物件的值,方法是將物件傳遞至非同步工作流程方法,其行為與活動非常相似。如需範例,請參閱 HelloWorldWorkflowAsync 應用程式

HelloWorldWorkflow 工作流程和活動實施

工作流程和活動實作具有相關聯的 Worker 類別,以ActivityWorkerWorkflowWorker。他們透過輪詢適當的 Amazon SWF 任務清單的任務、針對每個任務執行適當的方法,以及管理資料流程,來處理 Amazon SWF 與活動和工作流程實作之間的通訊。如需詳細資訊,請參閱AWS Flow Framework基本概念:應用程序結構

若要建立活動和工作流程實作與對應之工作者物件的關聯,您要實作可執行下列作業的一或多個工作者應用程式:

  • 使用 Amazon SWF 註冊工作流程或活動。

  • 建立工作者物件並建立其與工作流程或活動工作者實作的關聯。

  • 引導工作者物件開始與 Amazon SWF 進行通訊。

如果您想要將工作流程和活動執行為不同的程序,您必須實作不同的工作流程和活動工作者主機。如需範例,請參閱 HelloWorldWorkflowDistributed 應用程式。為簡化起見, HelloWorldWorkflow實作在相同程序中執行活動和工作流程 Worker 的單一 Worker 主機,如下所示:

import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClient; import com.amazonaws.services.simpleworkflow.flow.ActivityWorker; import com.amazonaws.services.simpleworkflow.flow.WorkflowWorker; public class GreeterWorker { public static void main(String[] args) throws Exception { ClientConfiguration config = new ClientConfiguration().withSocketTimeout(70*1000); String swfAccessId = System.getenv("AWS_ACCESS_KEY_ID"); String swfSecretKey = System.getenv("AWS_SECRET_KEY"); AWSCredentials awsCredentials = new BasicAWSCredentials(swfAccessId, swfSecretKey); AmazonSimpleWorkflow service = new AmazonSimpleWorkflowClient(awsCredentials, config); service.setEndpoint("https://swf.us-east-1.amazonaws.com"); String domain = "helloWorldWalkthrough"; String taskListToPoll = "HelloWorldList"; ActivityWorker aw = new ActivityWorker(service, domain, taskListToPoll); aw.addActivitiesImplementation(new GreeterActivitiesImpl()); aw.start(); WorkflowWorker wfw = new WorkflowWorker(service, domain, taskListToPoll); wfw.addWorkflowImplementationType(GreeterWorkflowImpl.class); wfw.start(); } }

GreeterWorker沒有 HelloWorld 對應項目,因此您必須將名為的 Java 類添加GreeterWorker到項目中,並將示例代碼複製到該文件中。

第一個步驟是建立和設定AmazonSimpleWorkflowClient物件,該物件會叫用基礎 Amazon SWF 服務方法。若要這麼做,GreeterWorker 會:

  1. 創建一個ClientConfiguration對象,並指定 70 秒的套接字超時。此值指定在關閉插槽前,透過已建立的開放連線傳輸資料的等待時間。

  2. 建立 Basic AWSCredentials 物件以識別 AWS 帳戶,並將帳戶金鑰傳遞至建構函式。為方便起見,也為了避免在程式碼中以純文字公開它們,金鑰會以環境變數存放。

  3. 建立表示工作流程的AmazonSimpleWorkflowClient物件,並將BasicAWSCredentialsClientConfiguration物件傳遞至建構函式。

  4. 設置客戶端對象的服務端點 URL。目前所有 AWS 區域均提供 Amazon SWF。

為方便起見,GreeterWorker 定義兩個字串常數。

  • domain是您在設定 Amazon SWF 帳戶時建立的工作流程的 Amazon SWF 網域名稱。 HelloWorldWorkflow假設您正在 "helloWorldWalkthrough" 網域中執行工作流程。

  • taskListToPoll是 Amazon SWF 用來管理工作流程和活動工作程式之間通訊的任務清單名稱。您可將名稱設成任何方便的字串。 HelloWorldWorkflow 工作流程和活動任務清單均使用 HelloWorldList ""。在幕後,名稱會以不同的命名空間作結,因此這兩份清單是截然不同的。

GreeterWorker使用字串常數和AmazonSimpleWorkflowClient物件來建立背景工作物件,以管理活動和背景工作實作與 Amazon SWF 之間的互動。尤其工作者物件處理的任務為向合適的任務清單輪詢任務。

GreeterWorker 建立 ActivityWorker 物件,並新增新的類別執行個體以設定它處理 GreeterActivitiesImpl。然後,GreeterWorker 呼叫 ActivityWorker 物件的 start 方法,指引物件開始輪詢指定的活動任務清單。

GreeterWorker 建立 WorkflowWorker 物件,並新增類別檔案名稱 GreeterWorkflowImpl.class 以設定它處理 GreeterWorkflowImpl。然後,它呼叫 WorkflowWorker 物件的 start 方法,指引物件開始輪詢指定的工作流程任務清單。

此時您可以順利執行 GreeterWorker。它會使用 Amazon SWF 註冊工作流程和活動,並啟動工作者物件輪詢其各自的任務清單。若要驗證這一點,請執行GreeterWorker並移至 Amazon SWF 主控台,然後helloWorldWalkthrough從網域清單中選取。如果您在「導覽」窗格中選擇「工作流程型態」,您應該會看到GreeterWorkflow.greet

HelloWorldWorkflow 工作流類型

如果您選擇 Activity Types (活動類型),即會顯示 GreeterActivities 方法:

HelloWorldWorkflow 活動類型

但如果您選擇 Workflow Executions (工作流程執行),會看到沒有任何作用中的執行。雖然工作流程和活動工作者正在輪詢任務,但我們尚未啟動工作流程執行。

HelloWorldWorkflow 起動器

最後一塊拼圖便是實作工作流程啟動者,其為起始工作流程執行的應用程式。執行狀態由 Amazon SWF 儲存,因此您可以檢視其歷史記錄和執行狀態。 HelloWorldWorkflow 透過修改GreeterMain類別來實作工作流程啟動器,如下所示:

import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClient; public class GreeterMain { public static void main(String[] args) throws Exception { ClientConfiguration config = new ClientConfiguration().withSocketTimeout(70*1000); String swfAccessId = System.getenv("AWS_ACCESS_KEY_ID"); String swfSecretKey = System.getenv("AWS_SECRET_KEY"); AWSCredentials awsCredentials = new BasicAWSCredentials(swfAccessId, swfSecretKey); AmazonSimpleWorkflow service = new AmazonSimpleWorkflowClient(awsCredentials, config); service.setEndpoint("https://swf.us-east-1.amazonaws.com"); String domain = "helloWorldWalkthrough"; GreeterWorkflowClientExternalFactory factory = new GreeterWorkflowClientExternalFactoryImpl(service, domain); GreeterWorkflowClientExternal greeter = factory.getClient("someID"); greeter.greet(); } }

GreeterMain 使用和 GreeterWorker 一樣的程式碼建立 AmazonSimpleWorkflowClient 物件。然後,它建立 GreeterWorkflowClientExternal 物件,作用如同工作流程的代理,非常類似在 GreeterWorkflowClientImpl 中建立的活動用戶端,作用如同活動方法的代理。不要使用 new 建立工作流程用戶端物件,您必須:

  1. 建立外部用戶端工廠物件,並將AmazonSimpleWorkflowClient物件和 Amazon SWF 網域名稱傳遞給建構函式。客戶端工廠對象是由框架的註釋處理器創建的,該處理器通過簡單地在工作流程接口名稱中附加 ClientExternalFactoryImpl "" 來創建對象名稱。

  2. 呼叫工廠物件的方法來建立外部用戶端物件,該getClient方法會在工作流程介面名稱中附加 "ClientExternal" 來建立物件名稱。您可以選擇性地傳遞 Amazon SWF 將用來識別此工作流程執行getClient個體的字串。否則,Amazon SWF 會使用產生的 GUID 來代表工作流程執行個體。

從工廠傳回的用戶端只會建立以傳入 getClient 方法的字串命名的工作流程 (從工廠傳回的用戶端在 Amazon SWF 中已有狀態)。若要使用不同的 ID 執行工作流程,您需要回到 factory 並使用另外指定的 ID 建立新的用戶端。

工作流程用戶端公開 GreeterMain 呼叫以開始工作流程的 greet 方法,因為 greet() 是以 @Execute 註釋指定的方法。

注意

註釋處理器也會建立內部用戶端 factory 物件,用以建立子工作流程。如需詳細資訊,請參閱 子工作流程執行

如果 GreeterWorker 還在執行,請暫時予以關機,然後執行 GreeterMain。您現在應該會在 Amazon SWF 主控台的使用中工作流程執行清單上看到 someId:。

HelloWorldWorkflow 工作流程執行

如果您選擇 someID 和選擇 Events (事件) 標籤,即會顯示事件:

HelloWorldWorkflow 初始工作流程事
注意

如果之前已啟動 GreeterWorker,且其還在執行,您會看到一份較長的事件清單,內含最近討論過的原因。停止 GreeterWorker 並再次嘗試執行 GreaterMain

Events (事件) 標籤只顯示兩個事件:

  • WorkflowExecutionStarted 表示工作流程已開始執行。

  • DecisionTaskScheduled表示 Amazon SWF 已將第一個決策任務排入佇列中。

在第一個決策任務封鎖工作流程的原因是,工作流程分散到兩個應用程式 GreeterMainGreeterWorkerGreeterMain​ 已啟動工作流程執行,但 GreeterWorker​ 未執行,所以工作者未輪詢清單與執行任務。應用程式 您可單獨執行任一應用程式,但工作流程執行需要兩者,才能在第一項決策任務後繼續進行。如果您現在執行 GreeterWorker,則工作流程和活動工作者會開始輪詢,各種任務會迅速完成。如果您現在勾選 Events (事件) 標籤,即會顯示第一批次的事件。

HelloWorldWorkflow 完整的工作流程

您可以選擇個別事件以取得詳細資訊。當你已經看完, 工作流應該已經打印「Hello World!」 到您的控制台。

工作流程完成後,即不會出現在作用中的執行清單上。但您若想予以檢閱,請選擇 Closed (已結束) 執行狀態按鈕,然後選擇 List Executions (列出執行)。這會顯示指定網域 (helloWorldWalkthrough) 中所有已完成但未超過保留期的工作流程執行個體,其中保留期已於您建立網域時指定。

HelloWorldWorkflow 完成工作流

請注意,每個工作流程執行個體都有唯一的 Run ID (執行 ID) 值。不同的工作流程執行個體可使用相同的執行 ID,但一次只能用於一個作用中的執行。