ジョブリクエストスコープ部品は、ジョブリクエスト毎に beanインスタンス の生成や初期化を行う為の部品です。
ApplicationContex固定化機能を利用した際、通常のSpring Batchで既定されているstepスコープ・singletonスコープ・prototypeスコープの3種類のbean定義スコープだけでは、ジョブの実行毎に生成や初期化が必要なbeanの実装が困難な場合があります。ジョブリクエストスコープ部品は、主にApplicationContex固定化機能利用時のsigletonスコープ代替として、バッチアプリケーション作成を補助するための部品ですが、後述の通りsigletonスコープとは挙動が異なる点に留意してください。
各スコープを指定したbeanインスタンスの初期化タイミングと、そのインスタンスの共有範囲は、以下のように異なります。
| スコープ | beanインスタンスの初期化タイミング | beanインスタンスの共有範囲 | BS固有 |
|---|---|---|---|
| 未指定 | sigletonスコープと同様 | sigletonスコープと同様 | - |
| sigleton | ApplicationContext初期化時 | 同一のApplicationContext内で共有 | - |
| jobrequest | ジョブ開始後、beanの操作の初回実行時 | 同一のジョブ実行内で共有。同一定義のジョブであっても、別々の実行要求によって異なるインスタンスを利用 | ○ |
| step | ステップ開始後、beanの操作の初回実行時 | 同一のステップ実行内で共有 | - |
| chunk | beanの操作の実行時 | チャンク処理毎に共有。チャンク処理以外のタイミングではbeanの操作毎に別々のインスタンスを利用 | ○ |
| prototype | BeanFactory#getBean()実行時 | 取得したbeanを利用する側で制御 | - |
ApplicationContex固定化機能を利用する際に、以下の2つの条件がYESとなるBeanが存在する場合に、ジョブリクエストスコープ部品を使用することを検討します。1つの条件のみがYESとなる場合は、代替可能なスコープの指定を検討します。
singletonスコープのbeanは、ApplicationContex固定化機能が無効な場合、ジョブの開始時にApplicationContextが初期化される為、その延長でbeanインスタンスが初期化され、以降そのbeanインスタンスを共有するので 上記 A、B の条件を満たします。
ところが、ApplicationContex固定化機能を有効にすると、singletonスコープのbeanはバッチアプリケーションの有効化のタイミングに初期化され、そのバッチアプリケーションに定義されたジョブの実行間で共有されます。その結果、上記 Aの条件が満たせなくなります。
このとき、stepスコープ、または、prototypeスコープに指定しなおすことでそのbeanの利用のタイミングで該当のbeanインスタンスを初期化できますが条件 B が満たせなくなります。このような場合にジョブリクエストスコープ部品の利用を検討します。
本部品を利用するためには、バッチアプリケーションを下記の手順に従って修正してください。
<bean class="com.nec.webotx.batch.util.scope.BSJobRequestScope" />
<bean class="SOME_FQCN" scope="jobrequest" />