

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

# 継続的なワークフロー
<a name="continuous"></a>

一部のユースケースでは、永続的に実行されるワークフロー、または長期間実行するワークフロー (例: サーバー群の状況を監視するワークフロー) が必要な場合があります。

**注記**  
Amazon SWF はワークフロー実行の履歴全体を保持するため、履歴は時間の経過とともに増加し続けます。再生を実行すると、フレームワークは、Amazon SWF からこの履歴を取得します。そのため、履歴サイズが大きすぎると、コストが高くなります。このような長時間稼働ワークフローや継続的なワークフローでは、現在の実行を定期的に終了し、新しい実行を開始して処理を続行する必要があります。

 これは、論理的なワークフロー実行の続きです。生成した独自クライアントは、この目的のために使用することができます。ワークフロー実装では、独自クライアントで `@Execute` メソッドを呼び出します。現在の実行が完了したら、同じワークフロー ID を使用して、フレームワークで新しい実行を開始します。

また、現在の `DecisionContext` から取得できる `GenericWorkflowClient` の `continueAsNewOnCompletion` メソッドを呼び出して、実行を続けることもできます。たとえば、次のワークフロー実装では、タイマーが 1 日後に設定されており、独自のエントリポイントを呼び出して、新しい実行を開始します。

```
public class ContinueAsNewWorkflowImpl implements ContinueAsNewWorkflow {

    private DecisionContextProvider contextProvider
         = new DecisionContextProviderImpl();

    private ContinueAsNewWorkflowSelfClient selfClient
         = new ContinueAsNewWorkflowSelfClientImpl();

    private WorkflowClock clock
         = contextProvider.getDecisionContext().getWorkflowClock();

    @Override
    public void startWorkflow() {
        Promise<Void> timer = clock.createTimer(86400);
        continueAsNew(timer);
    }

    @Asynchronous
    void continueAsNew(Promise<Void> timer) {
        selfClient.startWorkflow();
    }
}
```

ワークフローが再帰的に呼び出された場合、保留中のタスクがすべて完了し、新しいワークフロー実行が開始されると、フレームワークは現在のワークフローを終了します。保留中のタスクがある限り、現在のワークフローの実行は終了しません。新しい実行では、履歴やデータが元の実行から自動的に継承されることはありません。新しい実行の状態を引き継ぐ場合は、入力として明示的に渡す必要があります。