

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

# Amazon SWF でのアクティビティワーカーの開発
<a name="swf-dg-develop-activity"></a>

アクティビティワーカーは、1 つ以上のアクティビティタイプの実装を提供します。アクティビティワーカーは、Amazon SWF と通信してアクティビティタスクを受け取り、実行します。同じアクティビティタイプのアクティビティタスクを実行する複数のアクティビティワーカーのフリートを持つことができます。

Amazon SWF は、ディサイダーがアクティビティタスクをスケジュールするときに、アクティビティワーカーがアクティビティタスクを使用できるようにします。ディサイダーがアクティビティタスクをスケジュールするときに、アクティビティワーカーがアクティビティタスクを実行するために必要なデータ (ユーザーが決定) を提供します。Amazon SWF は、アクティビティワーカーに送信する前に、このデータをアクティビティタスクに挿入します。

アクティビティワーカーは、ユーザーによって管理されます。アクティビティワーカーは任意の言語で記述できます。ワーカーは、API を通じて Amazon SWF と通信できる限り、どこでも実行できます。Amazon SWF はアクティビティタスクを実行するために必要なすべての情報を提供するため、すべてのアクティビティワーカーはステートレスにすることができます。ステートレスであることにより、ワークフローは高度にスケーラブルになり、高いキャパシティー要件を処理して、より多くのアクティビティワーカーを追加できます。

このセクションでは、アクティビティワーカーを実装する方法を説明します。アクティビティワーカーは繰り返し次の操作を行う必要があります。

1. アクティビティタスクについて Amazon SWF をポーリングします。

1. タスクの実行を開始する。

1. タスクの存続期間が長い場合は、ハートビートを Amazon SWF に定期的に報告する。

1. タスクが完了または失敗したことを報告し、結果を Amazon SWF に返す。

**Topics**
+ [アクティビティタスクのポーリング](#swf-dg-polling-activity-tasks)
+ [アクティビティタスクの実行](#swf-dg-performing-activity-tasks)
+ [アクティビティタスクのハートビートの報告](#swf-dg-managing-activity-tasks)
+ [アクティビティタスクの完了または失敗](#swf-dg-complete-or-fail)
+ [アクティビティワーカーの起動](#swf-dg-launch-activity-workers)

## アクティビティタスクのポーリング
<a name="swf-dg-polling-activity-tasks"></a>

アクティビティタスクを実行するには、各アクティビティワーカーは定期的に `PollForActivityTask` アクションを呼び出して Amazon SWF をポーリングする必要があります。

次の例では、アクティビティワーカー `ChargeCreditCardWorker01` は、タスクリスト `ChargeCreditCard-v0.1` でタスクをポーリングします。アクティビティタスクを使用できない場合、Amazon SWF は 60 秒後に空のレスポンスを送信します。空のレスポンスは、`taskToken` の値が空の文字列になっている `Task` 構造です。

```
https://swf.us-east-1.amazonaws.com
PollForActivityTask
{
  "domain" : "867530901",
  "taskList" : { "name": "ChargeCreditCard-v0.1" },
  "identity" : "ChargeCreditCardWorker01"
}
```

アクティビティタスクが使用可能になると、Amazon SWF はそれをアクティビティワーカーに返します。タスクには、アクティビティをスケジュールするときにディサイダーが指定するデータが含まれます。

アクティビティワーカーがアクティビティタスクを受け取ると、ワークを実行する準備が整います。次のセクションでは、アクティビティタスクの実行に関する情報を示します。

## アクティビティタスクの実行
<a name="swf-dg-performing-activity-tasks"></a>

アクティビティワーカーがアクティビティタスクを受け取ると、そのタスクを実行する準備が整います。

**アクティビティタスクを実行するには**

1. タスクの入力フィールドでコンテンツの内容を解釈するようにアクティビティワーカーをプログラムします。このフィールドには、タスクがスケジュールされたときにディサイダーによって指定されたデータが含まれます。

1. アクティビティワーカーがデータの処理を処理し、ロジックを実行するようにプログラムします。

次のセクションでは、長時間実行されるアクティビティについて Amazon SWF にステータスの更新を提供するようにアクティビティワーカーをプログラムする方法について説明します。

## アクティビティタスクのハートビートの報告
<a name="swf-dg-managing-activity-tasks"></a>

ハートビートタイムアウトがアクティビティタイプに登録された場合、アクティビティワーカーはハートビートタイムアウトを超える前にハートビートを記録する必要があります。アクティビティタスクがタイムアウト内にハートビートを提供しない場合、タスクはタイムアウトし、Amazon SWF がそれをクローズして新しい決定タスクをスケジュールします。それにより、タイムアウトについてディサイダーに通知します。次に、ディサイダーは、アクティビティタスクを再スケジュールするか、別のアクションを実行できます。

アクティビティワーカーがタイムアウト後に (`RespondActivityTaskCompleted` の呼び出しなどにより) Amazon SWF への接続を試みると、Amazon SWF は `UnknownResource` エラーを返します。

このセクションでは、アクティビティのハートビートを提供する方法を説明します。

アクティビティタスクのハートビートを記録するには、`RecordActivityTaskHeartbeat` アクションを呼び出すようにアクティビティワーカーをプログラムします。このアクションにより、アプリケーションにとって有効な方法で進捗状況を数量化するための自由形式のデータを保存するために使用できる文字列フィールドも提供されます。

この例では、アクティビティワーカーは Amazon SWF へのハートビートを報告し、詳細フィールドを使用して、アクティビティタスクが 40 パーセント完了したことを報告しています。ハートビートを報告するには、アクティビティワーカーはアクティビティタスクのタスクトークンを指定する必要があります。

```
https://swf.us-east-1.amazonaws.com
RecordActivityTaskHeartbeat
{
  "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223",
  "details" : "40"
}
```

このアクション自体では、ワークフロー実行履歴にイベントは作成されません。ただし、タスクがタイムアウトすると、ワークフロー実行履歴には、アクティビティワーカーによって生成された最後のハートビートからの情報が含まれた `ActivityTaskTimedOut` イベントが含まれます。

## アクティビティタスクの完了または失敗
<a name="swf-dg-complete-or-fail"></a>

アクティビティワーカーは、タスクの実行後に、アクティビティタスクの完了または失敗を報告します。

### アクティビティタスクの完了
<a name="completing-activity-task"></a>

アクティビティタスクを完了するには、アクティビティタスクを正常に完了した後で `RespondActivityTaskCompleted` アクションを呼び出し、タスクトークンを指定するようにアクティビティワーカーをプログラムします。

この例で、アクティビティワーカーは、タスクが正常に完了したことを示します。

```
https://swf.us-east-1.amazonaws.com
RespondActivityTaskCompleted
{
  "taskToken": "12342e17-80f6-FAKE-TASK-TOKEN32f0223",
  "results": "40"
}
```

アクティビティが完了すると、Amazon SWF はアクティビティが関連付けられたワークフロー実行の新しい決定タスクをスケジュールします。

対象のタスクの完了後に、別のアクティビティタスクをポーリングするようにアクティビティワーカーをプログラムします。これにより、アクティビティワーカーが継続的にタスクをポーリングして完了するループが作成されます。

アクティビティが *StartToCloseTimeout* 期間内に応答しないか、*ScheduleToCloseTimeout* を超えた場合、Amazon SWF はアクティビティタスクをタイムアウトし、決定タスクをスケジュールします。これにより、ディサイダーはタスクの再スケジュールなどの適切なアクションを実行できます。

例えば、Amazon EC2 インスタンスがアクティビティタスクを実行し、タスクが完了する前にインスタンスが失敗した場合、ディサイダーはワークフロー履歴でタイムアウトイベントを受け取ります。アクティビティタスクがハートビートを使用中の場合、Amazon EC2 インスタンスの失敗後、タスクが次のハートビートの提供に失敗すると、ディサイダーはイベントを受け取ります。そうでない場合、全体的なタイムアウト値の 1 つに一致する前にアクティビティタスクが完了に失敗すると、ディサイダーは最終的にイベントを受け取ります。次に、タスクを再割り当てするか、その他のアクションを実行するかをディサイダーが決定します。

### アクティビティタスクの失敗
<a name="failing-an-activity-task"></a>

アクティビティワーカーが何らかの理由でタスクを実行できないが、Amazon SWF とまだ通信できる場合、タスクを失敗するようにプログラムできます。

アクティビティタスクを失敗するようにアクティビティワーカーをプログラムするには、タスクのタスクトークンを指定する `RespondActivityTaskFailed` アクションを呼び出します。

```
https://swf.us-east-1.amazonaws.com
RespondActivityTaskFailed
{
  "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223",
  "reason" : "CC-Invalid",
  "details" : "Credit Card Number Checksum Failed"
}
```

開発者として、理由および詳細フィールドに保存される値を定義します。これらは自由形式の文字列です。アプリケーションに対応する任意のエラーコード規則を使用できます。Amazon SWF はこれらの値を処理しません。ただし、Amazon SWF はこれらの値をコンソールに表示する場合があります。

アクティビティタスクが失敗すると、Amazon SWF はアクティビティタスクが関連付けられているワークフロー実行の決定タスクをスケジュールし、失敗のディサイダーに通知します。失敗の特性に応じて、アクティビティを再スケジュールする、ワークフロー実行を失敗するなどにより、失敗したアクティビティを処理するようにディサイダーをプログラムします。

## アクティビティワーカーの起動
<a name="swf-dg-launch-activity-workers"></a>

アクティビティワーカーを起動するには、アクティビティワーカープラットフォームで使用できる実行可能ファイルにロジックをパッケージ化します。たとえば、Linux サーバーと Windows サーバーの両方で実行できる Java 実行可能ファイルとしてアクティビティコードをパッケージ化します。

ワーカーは、起動するとタスクに対してポーリングを開始します。ただし、ディサイダーがアクティビティタスクをスケジュールするまで、このポーリングはタスクなしでタイムアウトし、ワーカーはポーリングを続行します。

ポーリングはアウトバウンドリクエストであるため、アクティビティワーカーは、Amazon SWF エンドポイントにアクセスできるすべてのネットワークで実行できます。

必要な数のアクティビティワーカーを起動できます。ディサイダーがアクティビティタスクをスケジューリングする際に、Amazon SWF は自動的にアクティビティタスクをポーリング中のアクティビティワーカーに分散します。