

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

# AWS Flow Framework for Java で記述されたプログラムの実行
<a name="running"></a>

**Topics**
+ [WorkflowWorker](#running.workflowworker)
+ [ActivityWorker](#running.activityworker)
+ [ワーカースレッディングモデル](#running.threadingmodel)
+ [ワーカーの拡張機能](#running.workerextend)

このフレームワークでは、*ワーカークラス*を使用して、 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
<a name="running.workflowworker"></a>

変数名が示すように、このワーカークラスは、ワークフローの実装を目的としています。これは、タスクリストとワークフローの実装タイプで設定されます。ワーカークラスは、ループを実行して、指定のタスクリストでディシジョンタスクをポーリングします。ディシジョンタスクが送信されると、ワークフロー実装のインスタンスを作成し、`@Execute` メソッドを呼び出してタスクを処理します。

## ActivityWorker
<a name="running.activityworker"></a>

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

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

## ワーカースレッディングモデル
<a name="running.threadingmodel"></a>

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

![AWS Flow Framework for Java ベースのアプリケーションのトポロジ](http://docs.aws.amazon.com/ja_jp/amazonswf/latest/awsflowguide/images/threading.png)


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

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

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

![ワーカークラスのスレッディングモデル](http://docs.aws.amazon.com/ja_jp/amazonswf/latest/awsflowguide/images/executor.png)


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

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

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

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

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

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

## ワーカーの拡張機能
<a name="running.workerextend"></a>

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

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

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

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