intra-mart Accel Platform 非同期仕様書 第6版 2021-08-01

タスク処理

並列処理機能または 直列処理機能で登録されたタスクメッセージは、いずれタスクに変換されてビジネスロジックが実行されます。

実行可能タスク取得

タスク実行エンジンはタスク処理サービスを通じて定期的に並列タスクキューおよび直列タスクキューの状態を監視しています。 以下の状態をすべて満たす場合、タスク実行エンジンはタスクメッセージを実行可能と判断し、タスクキューの先頭から取得します。

  • タスク実行エンジンでは新しいタスクメッセージを受け付けてタスクを実行する余裕がある。

  • タスクキューに以下のいずれかのタスクメッセージが存在する。

    • 並列タスクキューの先頭に選択待機状態となっているタスクメッセージが登録されている。
      (ただし、並列タスクキューが有効状態であることが前提)
    • 直列タスクキューの先頭に選択待機状態となっているタスクメッセージが登録されていて、同タスクキュー内で以下の状態に該当するタスクが存在しない。
      (ただし、直列タスクキューが有効状態であることが前提)

上記の条件に一致するタスクメッセージが複数ある場合、タスクメッセージの受信日時が一番古いものが優先されます。 受信日時が同一のタスクメッセージが複数存在する場合、優先されるタスクメッセージは不定です。

この内容を実行可能タスク取得にも示します。

Task candidate

実行可能タスク取得

実行可能として判断され、タスク実行エンジンから取得されたタスクメッセージは処理実行中状態として扱われます。

タスク受付

タスク実行エンジンはタスクメッセージを取得すると、自身が「受け付けた」という情報(実行ノード)を該当タスクメッセージに更新します。 この時、受付日時もタスクメッセージに対して更新されます。

受付状態になった場合、イベントが発生します。 詳細はタスク受付を参照してください。

タスク処理開始

タスク実行エンジンは受け付けたタスクメッセージをタスクに変換しビジネスロジックを非同期で開始します。

  • Taskインタフェースを実装したタスクを登録している場合、run()メソッドが非同期で起動されます。
  • サーバサイドJavaScriptを利用してタスクメッセージを登録した場合、該当するJSファイルのrun()関数が呼ばれます。

ビジネスロジック内では、タスクメッセージ登録時のコンテキストを取得することが可能です。

タスクが開始される直前にイベントが発生します。 詳細はタスク処理開始を参照してください。

コラム

複数のタスクが同時に存在する場合、各タスク間の開始順序は受付順とは異なる場合があります。

開始順序を明確にしたい場合は、直列タスクキューを利用してください。

タスク処理完了

以下のいずれかの状態になった場合、タスク実行エンジンはタスクのビジネスロジックが完了したと判断します。

  • Taskインタフェースを実装したクラスのインスタンスのrun()メソッドが終了した場合(例外発生時も含む)
  • JSファイルのrun(parameter)関数が終了した場合(例外発生時も含む)

ただし、いずれの場合もタスク終了通知およびタスク強制中断によって終了した場合は上記の理由に含まれません。

ビジネスロジックが完了した場合、タスク実行エンジンは以下のような事後処理を行います。

  1. タスクキューから該当するタスクメッセージを削除します。
  2. タスクに対してイベントを通知します。 詳細はタスク処理完了を参照してください。

また、タスクメッセージが直列タスクキューに登録されたものであり、以下の条件をすべて満たす場合、該当する直列タスクキューの逐次処理は現在の状態に関わらず停止されます。

  • 登録時に、例外発生時は直列タスクキューの逐次処理を停止するように指定した。
  • タスク実行時に例外が発生した。

タスク受付拒否

タスク受付でタスクメッセージを受け付けようとした時、何らかの理由でタスク実行エンジンは受付を拒否する場合があります。

この場合、タスク実行エンジンは以下のような処理を行います。

  • 該当するタスクメッセージを未処理の状態に戻し、登録されていたタスクキューの先頭に再追加します。
  • タスクに対してイベントを通知します。 詳細はタスク受付拒否を参照してください。

なお、上記の処理は順不定です。

タスク終了通知

タスクのビジネスロジック続行中に、何らかの理由でタスクを終了するよう通知がされることがあります。

詳細はタスク終了通知を参照してください。

タスク強制中断

タスクのビジネスロジック続行中に、何らかの理由でタスクを強制停止するために、ビジネスロジックを実行しているスレッドに対してThread.stop()を呼び出す場合があります。

詳細はタスク強制中断を参照してください。