intra-mart Accel Platform 非同期プログラミングガイド 第3版 2019-04-01

タスクメッセージ登録処理

タスクメッセージをタスクキューに登録するとタスクがいずれ実行される状態に変わります。

非同期処理機能においてタスクメッセージを登録可能なタスクキューは以下の2種類があります。

  • 並列タスクキュー
    個々のタスクが独立し、互いの処理が実行順序や並列実行に依存しない場合に利用します。
  • 直列タスクキュー
    複数のタスク間に実行順序の依存関係がある場合に利用します。

タスクキューの詳細については非同期処理機能の仕様書を参照してください。

タスクキューに対するタスクメッセージの登録(共通事項)

タスクキューにタスクメッセージを登録する前に、タスクのビジネスロジック実行時に必要な情報がすべて準備されていることを確認してください。

一度タスクキューにタスクメッセージを登録すると、非同期処理機能は可能な限り早い段階でタスクのビジネスロジックの実行を開始します。 そのため、ビジネスロジックの実行時に必要となる情報を、タスクキューにタスクメッセージを登録した後に追加しようとしても、先にビジネスロジックの実行が完了してしまう場合も考えられます。

ビジネスロジック実行時に必要な情報はタスクの実装に依存します。 代表的な例として、以下のようなものがあります。

  • データベースへの登録
  • コンテキストへのデータ保存
  • ストレージサービスに対するファイル出力

並列タスクキューに対するタスクメッセージの登録

並列タスクキューは、個々のタスクが独立し、互いの処理が実行順序や並列実行に依存しない場合に利用します。

  • 並列タスクキューに登録されたタスクメッセージは先頭から順番に取り出されますが、その順番で開始されるとは限りません。
  • タスクの終了順序はタスクメッセージの登録順序は異なります。
  • 複数のタスクが同時に実行される場合があります。
Parallelized Task Queue

並列タスクキュー

並列タスクキューに対するタスクメッセージの登録方法は並列タスクキューに対するタスクメッセージの登録に示すとおりです。

並列タスクキューに対するタスクメッセージの登録
言語 API
Java jp.co.intra_mart.foundation.asynchronous.TaskManager#addParallelizedTask
サーバサイドJavaScript WorkManager#addParallelizedTask

これらのAPIの詳細については非同期処理機能の仕様書を参照してください。

直列タスクキューに対するタスクメッセージの登録

直列タスクキューは、複数のタスク間に実行順序の依存関係がある場合に利用します。

  • 同一のタスクキュー内のタスクであれば、実行順序は保証されます。

  • 直前のタスクが完了するまで、後続のタスクはブロックされます。

    注意

    実行中のタスクに対して終了通知をした場合、非同期処理機能は該当するタスクのreleaseメソッドを呼び出した後、直ちに次の処理を行います。 この時、実際のビジネスロジックの実行状態は無視されます。 つまり、同一タスクキューにあるタスクであっても、一時的に連続する2つのタスクが同時に実行される場合があります。

    このような状況を避けたい場合、releaseメソッド内でビジネスロジックの完了を待機するような実装をしてください。 詳細は単一実行の強制(直列タスクキュー)を参照してください。

  • タスクキューが異なるタスクは同時に実行される場合があります。

Serialized Task Queue

直列タスクキュー

直列タスクキューに対するタスクメッセージの登録方法は直列タスクキューに対するタスクメッセージの登録に示すとおりです。

直列タスクキューに対するタスクメッセージの登録
言語 API
Java jp.co.intra_mart.foundation.asynchronous.TaskManager#addSerializedTask
サーバサイドJavaScript WorkManager#addSerializedTask

これらのAPIの詳細については非同期処理機能の仕様書を参照してください。

例外発生時

直列タスクキューに登録されたタスクのビジネスロジック実行時に例外が発生した場合、後続のタスクの処理を行わず、直列タスクキューを停止する必要があると仮定します。

この場合、タスクメッセージの登録時にTaskManager#addSerializedTaskメソッドおよびWorkManager#addSerializedTask関数の第4引数にtrueを指定します。