AWS SWF (Simple Workflow Service)のPeriodic Workflowサンプル(Java)

| コメントをどうぞ

前記事 AWS SWF (Simple Workflow Service)のSplit Mergeサンプル(Java) に続いて、Periodic Workflowサンプルを取り上げます。このサンプルでは周期的にアクティビティを実行します。

事前準備とビルド

Helloworldと同じです。AWS SWF (Simple Workflow Service)を使ってみる(Java) の事前準備とビルドを参照してください。

ActivityHost

aws-java-sdk-1.8.9.1\samples\AwsFlowFrameworkからコマンドプロンプトを開いて、以下のコマンドを実行すると起動されます。

ant -f build.xml -Dmain-class="com.amazonaws.services.simpleworkflow.flow.examples.periodicworkflow.ActivityHost" run

ソースを見ると、PeriodicWorkflowActivitiesImplインスタンスをアクティビティに登録しています。
メソッドが1つあり、AWS管理コンソールで確認すると1つのアクティビティ(PeriodicWorkflowActivities.doSomeWork)が登録されています。

WorkflowHost

aws-java-sdk-1.8.9.1\samples\AwsFlowFrameworkからコマンドプロンプトを開いて、以下のコマンドを実行すると起動されます。

ant -f build.xml -Dmain-class="com.amazonaws.services.simpleworkflow.flow.examples.periodicworkflow.WorkflowHost" run 

ソースを見ると、PeriodicWorkflowImplクラスをワークフローに登録しています。
ここではタイマーを起動しています。

public void callPeriodicActivity(long startTime, Promise<?>... waitFor) {
    long currentTime = clock.currentTimeMillis();
    if ((currentTime - startTime) < options.getContinueAsNewAfterSeconds() * SECOND) {
        Promise<Void> activityCompletion = activities.scheduleActivity(activityType, activityArguments, null, Void.class);
        if (!options.isWaitForActivityCompletion()) {
            activityCompletion = Promise.Void();
        }
        Promise<Void> timer = clock.createTimer(options.getExecutionPeriodSeconds());
        callPeriodicActivity(startTime, timer, activityCompletion);
    }
}

AWS管理コンソールで確認するとPeriodicWorkflowが登録されています。

WorkflowExecutionStarter

aws-java-sdk-1.8.9.1\samples\AwsFlowFrameworkからコマンドプロンプトを開いて、以下のコマンドを実行すると起動されます。

ant -f build.xml -Dmain-class="com.amazonaws.services.simpleworkflow.flow.examples.periodicworkflow.WorkflowExecutionStarter" run

実行するとコンソールにメッセージが表示されます。

Started periodic workflow with workflowId="periodic1" and runId="xxx"

またActivityHostのコンソールに数秒ごとにメッセージが表示されます。

Please press any key to terminate service.
Run Id: xxx, Do some periodic task here for 1187 milliseconds with parameter=parameter1
Run Id: xxx, Do some periodic task here for 2399 milliseconds with parameter=parameter1
Run Id: xxx, Do some periodic task here for 2483 milliseconds with parameter=parameter1

再度WorkflowExecutionStarterを起動すると、既に起動している旨のメッセージを表示します。

Periodic workflow with workflowId="periodic1 is already running

ソースを見ると、オプションを付けてクライアントを呼び出しています。

PeriodicWorkflowClientExternalFactory clientFactory = new PeriodicWorkflowClientExternalFactoryImpl(swfService, domain);
PeriodicWorkflowClientExternal workflow = clientFactory.getClient("periodic1");
PeriodicWorkflowOptions options = new PeriodicWorkflowOptions();
options.setExecutionPeriodSeconds(10);
options.setContinueAsNewAfterSeconds(30);
options.setCompleteAfterSeconds(120);
options.setWaitForActivityCompletion(true);
ActivityType activityType = new ActivityType();
activityType.setName("PeriodicWorkflowActivities.doSomeWork");
activityType.setVersion("1.0");
Object[] parameters = new Object[] { "parameter1" };
workflow.startPeriodicWorkflow(activityType, parameters, options);

AWS管理コンソールのWorkflow Executionsの一覧から実行した履歴を選択し、Activitiesタブを選択するとアクティビティが3回呼び出された履歴が確認できます。
aws-swf-periodic-workflow1

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>