10.3. ジョブエグゼキューター

ジョブエクゼキュータは、 プロセス実行を非同期に再開するコンポーネントです。 非同期メッセージシステムを介してコマンドメッセージが到着するまで待機し、 実行します。非同期続行に使用される 2 つのジョブは ExecuteNodeJobExecuteActionJob です。
これらのジョブメッセージは、 プロセス実行により生成されます。 プロセス実行中に、 非同期で実行する必要がある各ノードまたはアクションに対して Job (POJO) が MessageService へ送信されます。 メッセージサービスは JbpmContext と関連付けられ、 送信する必要があるすべてのメッセージを収集します。
メッセージは JbpmContext.close() の一部として送信されます。 このメソッドは関連付けられたすべてのサービスに対して close() 呼び出しをカスケード処理します。 実際のサービスは jbpm.cfg.xml で設定できます。 サービスの 1 つ DbMessageService はデフォルトで設定され、 新しいジョブメッセージが利用可能であることをジョブエクゼキュータに通知します。
グラフ実行メカニズムはMessageServiceFactory インターフェースと MessageService インターフェースを使用してメッセージを送信します。 これにより非同期メッセージサービスが設定可能になります (jbpm.cfg.xml)。 Java EE 環境では、 DbMessageServiceJmsMessageService に置き換えて、 アプリケーションサーバーの機能を活用できます。
ジョブエクゼキュータの挙動に関する要約は次の通りです。
ジョブはデータベースのレコードです。 ジョブはオブジェクトであり、 実行可能です。 タイマーと非同期メッセージはジョブになります。 非同期メッセージの場合、 メッセージが挿入された時に dueDate が現在の時間に設定されます。 ジョブエクゼキュータはジョブを実行する必要がありますが、次の 2 つの段階で実行されます。
  • ジョブエグゼキュータースレッドはジョブを取得する必要がある
  • ジョブエグゼキュータースレッドはジョブを取得する必要がある
ジョブの取得と実行は、別のトランザクションとして実行されます。ディスパッチャースレッドは、このノードの全エグゼキュータースレッドの代わりにデータベースからジョブを取得します。エグゼキュータースレッドがジョブを取得すると、その名前をジョブの所有者フィールドに追加します。各スレッドには、IP アドレスやシーケンス番号に従い一意名が設定されています。
スレッドはジョブの取得と実行の間に消失する可能性があります。このような状況をクリーンアップするため、1 つのジョブエグゼキューターごとにロック時間をチェックする 1 つのロックモニタスレッドが存在します。30 分以上ロックされているジョブは、他のジョブによって実行されるようロックモニタースレッドによってロック解除されます。
Hibernate のオプティミスティックロックが正常に動作するために必要な分離レベルは REPEATABLE_READ にセットする必要があります。 REPEATABLE_READ により、 このクエリが 1 つの競合トランザクションで 1 つの行のみを更新することが保証されます。
update JBPM_JOB job
set job.version = 2
    job.lockOwner = '192.168.1.3:2'
where 
    job.version = 1
Non-Repeatable Reads とは、 トランザクションが以前に読み取ったデータを再び読み取り、 トランザクションの以前の読み取り移行にコミットされた他のトランザクションによってデータが変更されていることを発見する特殊な状態を示します。
Non-Repeatable Reads は楽観ロックにとって問題です。分離レベル READ_COMMITTED は Non-Repeatable Reads の発生を許すため、十分ではありません。したがって、複数のジョブエグゼキュータースレッドを設定する場合はREPEATABLE_READ が必要です。
ジョブエグゼキューター関連の設定プロパティは以下の通りです。
jbpmConfiguration
設定をリトリーブする bean
name
ジョブエグゼキューター名

重要

1 台のマシンに JBPM インスタンスが 1 つ以上、開始されている場合、この名前は各ノードに一意でなければなりません。
nbrOfThreads
開始されたエグゼキュータースレッドの数
idleInterval
保留されているジョブがない場合、ディスパッチャースレッドがジョブのキューを確認するまでに待機する時間

注記

キューにジョブが追加されると、ディスパッチャースレッドに自動通知されます。
retryInterval
実行時に問題があった場合のジョブ再試行の間隔。デフォルト値は 3 回です。

注記

再試行の最大回数は jbpm.job.retries で設定されています。
maxIdleInterval
idleInterval の最大期間
historyMaxSize
このプロパティは廃止されるため、特に影響はありません。
maxLockTime
lock-monitor スレッドがアンロックするまでジョブをロックできる最大時間
lockMonitorInterval
lock-monitor スレッドがロックされているジョブの確認をする際の休止間隔
lockBufferTime
このプロパティは廃止されるため、特に影響はありません。