本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
執行使用 撰寫的程式AWS Flow Framework適用於 Java 的
該框架提供工作者類別初始化AWS Flow Framework,並與 Amazon SWF 進行通信。為實作工作流程或活動工作者,您必須建立及啟動工作者類別的執行個體。這些工作者類別負責管理持續的非同步操作、調用已解鎖的非同步方法,並與 Amazon SWF 通訊。它們可使用工作流程和活動實作、執行緒數目、要輪詢的任務清單等設定而成。
框架提供兩種工作者類別,一個用於活動,一個用於工作流程。為執行工作流程邏輯,您要使用 WorkflowWorker
類別。同樣地,在活動方面則使用 ActivityWorker
類別。這些類別會在您的實作中自動向輪詢 Amazon SWF,並在您的實作中調用適合的方法。
下列範例說明如何執行個體化 WorkflowWorker
並開始輪詢任務:
AmazonSimpleWorkflow swfClient = new AmazonSimpleWorkflowClient(awsCredentials); WorkflowWorker worker = new WorkflowWorker(swfClient, "domain1", "tasklist1"); // Add workflow implementation types worker.addWorkflowImplementationType(MyWorkflowImpl.class); // Start worker worker.start();
建立 ActivityWorker
之執行個體和開始輪詢任務的基本步驟如下:
AmazonSimpleWorkflow swfClient = new AmazonSimpleWorkflowClient(awsCredentials); ActivityWorker worker = new ActivityWorker(swfClient, "domain1", "tasklist1"); worker.addActivitiesImplementation(new MyActivitiesImpl()); // Start worker worker.start();
當您想要關機活動或決策者時,您的應用程式應該將正在使用的工作者類型執行個體及 Amazon SWF Java 用户端執行個體關機。這會確保工作者類型使用的所有資源都正確釋出。
worker.shutdown(); worker.awaitTermination(1, TimeUnit.MINUTES);
為啟動執行,請只建立產生之外部用戶端的執行個體,並呼叫 @Execute
方法。
MyWorkflowClientExternalFactory factory = new MyWorkflowClientExternalFactoryImpl(); MyWorkflowClientExternal client = factory.getClient(); client.start();
WorkflowWorker
如名稱所示,此工作者類別目的在供工作流程實作使用。它以任務清單和工作流程實作類型設定而成。工作者類型會執行迴圈來輪詢指定任務清單中的決策任務。收到決策任務時,它會建立工作流程實作的執行個體,並呼叫 @Execute
方法處理任務。
ActivityWorker
若要實作活動工作者,您可使用 ActivityWorker
類別以便向任務清單輪詢活動任務。您可使用活動實作物件設定活動工作者。此工作者類型會執行迴圈來輪詢指定任務清單中的活動任務。收到活動任務時,它會尋找您提供的適合實作,並呼叫活動方法處理任務。與呼叫 factory 為每項決策任務建立新執行個體的 WorkflowWorker
不同,ActivityWorker
只使用您提供的物件。
所以此ActivityWorker
類使用AWS Flow Framework來決定註冊和執行選項。
工作者執行緒模型
在 中AWS Flow Framework,則活動或決策者的具體代表是工作者類別的執行個體。您的應用程式負責在應做為工作者的每部電腦和每項程序上設定和執行個體化工作者物件。然後,工作者物件會自動從 Amazon SWF 接收任務,將它們分派到您的活動或工作流程實作,再向 Amazon SWF 報告結果。單一工作流程執行個體可能跨多個工作者。當 Amazon SWF 有一或多個待定活動任務時,它會將任務指派給第一個可用的工作者,再指派給下一個,以此類推。這讓屬於同一個工作流程執行個體的任務可能同時在不同的工作者上處理。
此外,每個工作者都可設定成在多個執行緒上處理任務。這表示即使只有一個工作者,工作流程執行個體的活動任務也可以同時執行。
除非 Amazon SWF 會保證給定的工作流程執行一次只會執行一項決策,決策任務的行為類似。單一工作流程執行一般需要多項決策任務,因此結果可能也會在多個程序和執行緒上執行。決策者以該類型的工作流程實作設定而成。當決策者收到決策任務時,它會建立工作流程實作的執行個體 (物件)。框架提供可擴充的 factory 模式來建立這些執行個體。預設工作流程 factory 每次都會建立新的物件。您可提供自訂的 factory 來覆寫此行為。
與以工作流程實作類型設定的決策者相反,活動工作者以活動實作的執行個體 (物件) 設定而成。當活動工作者收到活動任務時,它會分派給合適的活動實作物件。
工作流程工作者會維護單一執行緒集區,並在用來向輪詢 Amazon SWF 任務的同一個執行緒上執行工作流程。因為活動會長期執行 (至少與工作流程邏輯相比是如此),所以活動工作者類別會維護兩個不同的執行緒集區,一個用於向輪詢 Amazon SWF 活動任務,另一個則執行活動實作以處理任務。這可讓您分別設定要輪詢任務的執行緒數目,及要執行該任務的執行緒數目。例如,您可使用少數執行緒來輪詢,並用多數執行緒來執行任務。只有在活動工作者類別有可用的輪詢執行 Amazon SWF,及具有可用執行緒來處理任務時,它才會向輪詢任務。
這種執行緒和執行個體行為表示:
活動實作必須無狀態。您不應使用執行個體變數將應用程式狀態存放在活動物件中。但是,您可以使用欄位存放資源,例如資料庫連線。
活動實作必須是安全執行緒。因為同一個執行個體可能同時用來處理不同執行緒的任務,所以必須同步活動程式碼的共享資源存取權。
工作流程實作可以具有狀態,而執行個體變數可用來存放狀態。即使建立了新的工作流程實作執行個體來處理每項決策任務,框架仍會確保正確地重新建立該狀態。但是,工作流程實作必須具有確定性。如需詳細資訊,請參閱「一探究竟」一節。
在使用預設 factory 時,工作流程實作不需安全執行緒。預設實作會確保一次只有一個執行緒使用工作流程實作執行個體。
工作者可擴充性
所以此AWS Flow Framework也包含幾個讓您能夠精確控制及可擴充的下層工作者類別。使用它們,您可完全自訂工作流程和活動類型註冊,並設定 factory 來建立實作物件。這些工作者為 GenericWorkflowWorker
和 GenericActivityWorker
。
GenericWorkflowWorker
可使用 factory 設定以建立工作流程定義 factory。工作流程定義 factory 負責建立工作流程實作的執行個體,及提供註冊選項這類組態設定。在一般的情況下,您應該直接使用 WorkflowWorker
類別。它會自動建立並設定框架中提供的 factory 實作,即 POJOWorkflowDefinitionFactoryFactory
和 POJOWorkflowDefinitionFactory
。factory 要求工作流程實作類別必須具有無引數的建構函數。此建構函數用於在執行時間建立工作流程物件的執行個體。factory 會查看您在工作流程界面和實作上使用的註釋,以建立適合的註冊和執行選項。
您可透過實作 WorkflowDefinitionFactory
、WorkflowDefinitionFactoryFactory
和 WorkflowDefinition
,提供自己的 factory 實作。工作者類別使用 WorkflowDefinition
類別來分派決策任務和訊號。透過實作這些基礎類別,您可完全自訂 factory 和工作流程實作請求的分派。例如,您可使用這些可擴充性點提供自訂的程式設計模型撰寫工作流程,例如,根據您自己的註釋來撰寫或從 WSDL 產生它,而不是框架使用的第一個程式碼方法。為使用您自訂的 factory,您必須使用 GenericWorkflowWorker
類別。如需這些類別的詳細資訊,請參閱AWS SDK for Java文件。
同樣地,GenericActivityWorker
可讓您提供自訂活動實作 factory。透過實作 ActivityImplementationFactory
和 ActivityImplementation
類別,您可完全控制活動執行個體化以及自訂註冊和執行選項。如需這些類別的詳細資訊,請參閱AWS SDK for Java文件。