AWS Flow Framework for Java を使用して書き込まれるプログラムを実行する - AWS Flow Framework Java 用

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS Flow Framework for Java を使用して書き込まれるプログラムを実行する

このフレームワークでは、ワーカークラスを使用して、AWS Flow Framework for Java ランタイムを初期化し、Amazon SWF と通信することができます。ワークフローまたはアクティビティワーカーを実装するには、ワーカークラスのインスタンスを作成して起動する必要があります。これらのワーカークラスは、進行中の非同期オペレーションの管理、ブロック解除される非同期メソッドの呼び出し、Amazon SWF との通信を行います。これらは、ワークフローおよびアクティビティ実装、スレッド数、ポーリングするタスクリストなどを使用して設定できます。

フレームワークには 2 つのワーカークラスが用意されており、アクティビティとワークフローに使用します。ワークフローロジックを実行するには、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 クラスを使用して、アクティビティタスクのタスクリストを簡単にポーリングできます。アクティビティ実装オブジェクトを使用して、アクティビティワーカーを設定します。このワーカークラスは、ループを実行して、指定のタスクリストでアクティビティタスクをポーリングします。アクティビティタスクが送信されると、指定した適切な実装を検索し、アクティビティメソッドを呼び出して、タスクを処理します。ファクトリを呼び出して、ディシジョンタスクごとに新しいインスタンスを作成する WorkflowWorker とは異なり、ActivityWorker は、指定したオブジェクトを単純に使用します。

ActivityWorker クラスは、AWS Flow Framework for Java の注釈を使用して、登録および実行オプションを決定します。

ワーカースレッディングモデル

AWS Flow Framework for Java では、アクティビティまたはディサイダーには、ワーカークラスのインスタンスが含まれます。アプリケーションは、各マシンのワーカーオブジェクト、およびワーカーとして動作するプロセスの設定およびインスタンス化を行います。ワーカーオブジェクトは、Amazon SWF から自動的にタスクを受け取り、アクティビティおよびワークフロー実装に割り当て、結果を Amazon SWF に報告します。1 つのワークフローインスタンスで多数のワーカーをカバーできます。Amazon SWF に保留中のアクティビティタスクが 1 つ以上ある場合、タスクは利用可能な最初のワーカーに割り当てられ、次のワーカーと続きます。これにより、同じワークフローインスタンスに属するタスクを、異なるワーカーで同時に処理することができます。

AWS Flow Framework for Java ベースのアプリケーションのトポロジー

さらに、各ワーカーを設定して、複数のスレッドでタスクを処理することができます。そのため、ワークフローインスタンスのアクティビティタスクでは、ワーカーが 1 つでも同時に実行することができます。

ディシジョンタスクは、所定のワークフロー実行では、一度に 1 つの実行できないことを Amazon SWF で保証される例外と同様に動作します。1 つのワークフロー実行では、通常複数のディシジョンタスクが必要です。従って、プロセスやスレッドが複数の場合は実行が終了する場合があります。ディサイダーは、ワークフロー実装のタイプで設定されます。ディサイダーよりディシジョンタスクを受け取ると、ワークフロー実装のインスタンス (オブジェクト) がこのタスクで作成されます。このフレームワークでは、これらのインスタンスを作成する拡張可能なファクトリパターンが用意されています。デフォルトのワークフローファクトリでは、毎回新しいオブジェクトが作成されます。この動作を上書きするには、カスタムのファクトリを指定します。

ワークフロー実装タイプで設定されているディサイダーとは異なり、アクティビティワーカーは、アクティビティ実装のインスタンス (オブジェクト) で設定されます。アクティビティワーカーよりアクティビティタスクを受け取ると、適切なアクティビティ実装オブジェクトに割り当てられます。

ワーカークラスのスレッディングモデル

ワークフローワーカーは、1 つのスレッドプールを保持し、タスクの Amazon SWF をポーリングするために使用したのと同じスレッドでワークフローを実行します。アクティビティは長期的に稼働するため (ワークフローロジックと比較した場合)、アクティビティワーカークラスは、2 つのスレッドプールを保持します。1 つはアクティビティタスクでの Amazon SWF のポーリング、それ以外は、アクティビティ実装の実行によるタスクの処理を行います。これにより、実行するスレッドの数とは別に、タスク用にポーリングするスレッドの数を設定できます。たとえば、少数のスレッドをポーリングし、多数のスレッドでタスクを実行することができます。アクティビティワーカークラスは、無制限のポーリングスレッドと無制限のスレッドでタスクを処理する場合にのみ、タスクの Amazon SWF をポーリングします。

このスレッディングおよびインスタンスの動作は、次のことを意味します。

  1. アクティビティタスクはステートレスである必要がある。インスタンス変数を使用して、アクティビティオブジェクトにアプリケーション状態を保存しないでください。ただし、フィールドを使用して、データベース接続などのリソースを保存する場合があります。

  2. アクティビティタスクはスレッドセーフである必要がある。同じインスタンスを使用して、異なるスレッドのタスクを同時に処理する場合があるため、アクティビティコードから共有されたリソースへのアクセスを同期させる必要があります。

  3. ワークフロー実装はステートフルの場合があり、インスタンス変数を使用して状態を保存する場合があります。ワークフロー実装の新しいインスタンスを作成して、ディシジョンタスクごとに処理していますが、フレームワークでは、状態が正式に再作成されます。ただし、ワークフロー実装は決定的である必要があります。詳細については、「表面下の動作」セクションを参照してください。

  4. ワークフローの実装では、デフォルトファクトリを使用する際、スレッドセーフにする必要はありません。デフォルトの実装では、1 つのスレッドで一度にワークフロー実装のインスタンスが使用されます。

ワーカーの拡張機能

AWS Flow Framework for Java にも、きめの細かいコントロールや拡張性を実現した低レベルのワーカークラスがいくつかあります。これにより、実装オブジェクトを作成する際、ワークフローやアクティビティタイプの登録を完全にカスタマイズし、ファクトリを設定できます。これらのワーカーは GenericWorkflowWorkerGenericActivityWorker です。

ワークフロー定義ファクトリを作成するためにファクトリを使用して、GenericWorkflowWorker を設定できます。ワークフロー定義ファクトリは、ワークフロー実装のインスタンスを作成し、登録オプションなどの構成設定を提供する役割を担います。通常の場合、WorkflowWorker クラスを直接使用する必要があります。フレームワークで提供されるファクトリ実装 (POJOWorkflowDefinitionFactoryFactory および POJOWorkflowDefinitionFactory) を自動的に作成および設定できます。ファクトリでは、ワークフロー実装クラスに引数コンストラクタは必要ありません。このコンストラクタは、実行時にワークフローオブジェクトのインスタンスを作成するために使用されます。ファクトリは、ワークフローインターフェイスおよび実装で使用した注釈を参照して、適切な登録および実行オプションを作成します。

ファクトリを独自に実装するには、WorkflowDefinitionFactoryWorkflowDefinitionFactoryFactory、および WorkflowDefinition を実装します。WorkflowDefinition クラスは、ディシジョンタスクおよびシグナルを割り当てるためにワーカークラスで使用されます。これらの基本クラスを実装することで、ファクトリと、ワークフロー実装へのリクエストの割り当てを完全にカスタマイズできます。たとえば、独自の注釈に基づき、ワークフローを記述するか、またはフレームワークで使用されるコードの最初のアプローチではなく、WSDL から生成するには、これらの拡張ポイントを使用して、カスタムプログラミングモデルを作成します。カスタムファクトリを使用するには、GenericWorkflowWorker クラスを使用する必要があります。これらのクラスの詳細については、AWS SDK for Java のドキュメントを参照してください。

同様に、GenericActivityWorker を使用して、カスタムアクティビティ実装ファクトリを作成できます。ActivityImplementationFactory および ActivityImplementation クラスを実装することで、アクティビティのインスタンス化を完全に制御できるだけでなく、登録および実行オプションをカスタマイズできます。これらのクラスの詳細については、AWS SDK for Java のドキュメントを参照してください。