

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

# ワークフローコントラクトとアクティビティコントラクト
<a name="features.workflow"></a>

Java インターフェイスを使用してワークフローとアクティビティの署名を宣言します。このインターフェイスは、ワークフロー (またはアクティビティ) の実装と、そのワークフロー (またはアクティビティ) のクライアントとの間でコントラクトを構成します。たとえば、ワークフロータイプ `MyWorkflow` は、`@Workflow` 注釈を設定したインターフェイスを使用して定義します。

```
@Workflow
@WorkflowRegistrationOptions(
   defaultExecutionStartToCloseTimeoutSeconds = 60,
   defaultTaskStartToCloseTimeoutSeconds = 10)
public interface MyWorkflow
{
    @Execute(version = "1.0")
    void startMyWF(int a, String b);

    @Signal
    void signal1(int a, int b, String c);

    @GetState
    MyWorkflowState getState();
}
```

コントラクトには、実装固有の設定がありません。この実装に依存しないコントラクトを使用することで、クライアントを実装から分離し、クライアントを損なうことなく実装の詳細を柔軟に変更できます。逆に、クライアントの変更に伴って関連するワークフローやアクティビティを変更する必要がありません。たとえば、アクティビティ実装の変更を必要とせずに、Promise (`Promise<T>`) を使用してアクティビティを非同期的に呼び出すようにクライアントを変更できます。同様に、アクティビティの実装を変更して、アクティビティのクライアントの変更を必要とせずに、アクティビティ実装を (E メールの送信者などが) 非同期で完了するようにすることができます。

上の例では、ワークフローインターフェイス `MyWorkflow` に、新しい実行を開始するためのメソッドとして `startMyWF` が含まれています。このメソッドには `@Execute` 注釈が設定されており、戻り値の型として `void` または `Promise<>` を使用する必要があります。特定のワークフローインターフェイスで、この注釈を設定できるメソッドは最大 1 つです。このメソッドはワークフローロジックのエントリポイントであり、フレームワークでは、決定タスクを受け取ったときに、このメソッドを呼び出してワークフローロジックを実行します。

ワークフローインターフェイスは、ワークフローに送信するシグナルも定義します。シグナルメソッドは、一致する名前のシグナルがワークフロー実装で受信されたときに呼び出されます。例えば、`MyWorkflow` インターフェイスは、`@Signal` 注釈が設定されたシグナルメソッド (`signal1`) を宣言します。

`@Signal`注釈は、シグナルメソッドに必須です。シグナルメソッドの戻り値の型は、`void` であることが必要です。ワークフローインターフェイスには、ゼロ個以上のシグナルメソッドが定義されている場合があります。`@Execute` メソッドなしのワークフローインターフェイスと、いくつかの `@Signal` メソッドを宣言し、実行は開始できないが進行中の実行にシグナルを送信できるクライアントを生成できます。

`@Execute` 注釈と `@Signal` 注釈を設定したメソッドでは、`Promise<T>` やその派生型を除くあらゆる型のパラメータをいくつでも使用できます。これにより、ワークフロー実装の開始時と実行中に、厳密に型指定された入力を渡すことができます。`@Execute` メソッドの戻り値の型は、`void` または `Promise<>` であることが必要です。

さらに、ワークフロー実行の最新状態を報告するためのメソッド (前の例の `getState` メソッドなど) をワークフローインターフェイスで宣言することもできます。この状態は、ワークフローのアプリケーション状態を全面的に反映するものではありません。この機能の用途は、最大 32 KB のデータを保存して、実行の最新ステータスを示すことにあります。たとえば、注文処理ワークフローでは、受注、注文処理、またはキャンセルを示す文字列を保存できます。このメソッドは、決定タスクが完了するたびに、フレームワークから呼び出されて最新状態を取得します。状態は Amazon Simple Workflow Service (Amazon SWF) に保存され、生成された外部クライアントを使用して取得できます。これにより、ワークフロー実行の最新状態をチェックできます。`@GetState` 注釈を設定したメソッドは、引数を取ることはできず、戻り値の型として `void` を使用することはできません。このメソッドからは、必要に応じて任意の型を返すことができます。上の例では、`MyWorkflowState` (下の定義を参照) のオブジェクトがメソッドから返され、文字列状態と進捗状況 (%) の保存に使用されます。このメソッドは、ワークフロー実装オブジェクトの読み取り専用アクセスを実行するものであり、同期的に呼び出されます。これにより、`@Asynchronous` 注釈を設定したメソッドを呼び出すなどの非同期操作は禁止されます。`@GetState` 注釈を設定できるメソッドは、ワークフローインターフェイスで最大 1 つです。

```
public class MyWorkflowState {
   public String status;
   public int percentComplete;
}
```

同様に、アクティビティのセットを定義するには、`@Activities` 注釈を設定したインターフェイスを使用します。インターフェイスの各メソッドは、アクティビティに対応しています。以下に例を挙げます。

```
@Activities(version = "1.0")
@ActivityRegistrationOptions(
     defaultTaskScheduleToStartTimeoutSeconds = 300,
     defaultTaskStartToCloseTimeoutSeconds = 3600)
public interface MyActivities {
    // Overrides values from annotation found on the interface
    @ActivityRegistrationOptions(description = "This is a sample activity",
         defaultTaskScheduleToStartTimeoutSeconds = 100,
         defaultTaskStartToCloseTimeoutSeconds = 60)
    int activity1();

    void activity2(int a);
}
```

このインターフェイスでは、複数の関連するアクティビティをグループ化できます。アクティビティインターフェイス内には、アクティビティをいくつでも定義できます。また、アクティビティインターフェイスは、必要に応じていくつでも定義できます。`@Execute` メソッドや `@Signal` メソッドと同様に、アクティビティメソッドでは `Promise<T>` やその派生型を除くあらゆる型の引数をいくつでも使用できます。アクティビティの戻り値の型として、`Promise<T>` やその派生型は使用できません。