ジョブリクエストスコープ部品

概要

ジョブリクエストスコープ部品は、ジョブリクエスト毎に beanインスタンス の生成や初期化を行う為の部品です。
ApplicationContex固定化機能を利用した際、通常のSpring Batchで既定されているstepスコープ・singletonスコープ・prototypeスコープの3種類のbean定義スコープだけでは、ジョブの実行毎に生成や初期化が必要なbeanの実装が困難な場合があります。ジョブリクエストスコープ部品は、主にApplicationContex固定化機能利用時のsigletonスコープ代替として、バッチアプリケーション作成を補助するための部品ですが、後述の通りsigletonスコープとは挙動が異なる点に留意してください。

beanの初期化タイミングについて

各スコープを指定した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となる場合は、代替可能なスコープの指定を検討します。

  1. ジョブの開始時にbeanインスタンスの生成処理が実行されて欲しいbeanである
    AのみがYESの場合
    step、 prototypeスコープで代替可能
  2. ジョブの実行内で一意なbeanオブジェクトである必要がある
    BのみがYESの場合
    sigletonスコープで代替可能

singletonスコープのbeanは、ApplicationContex固定化機能が無効な場合、ジョブの開始時にApplicationContextが初期化される為、その延長でbeanインスタンスが初期化され、以降そのbeanインスタンスを共有するので 上記 A、B の条件を満たします。
ところが、ApplicationContex固定化機能を有効にすると、singletonスコープのbeanはバッチアプリケーションの有効化のタイミングに初期化され、そのバッチアプリケーションに定義されたジョブの実行間で共有されます。その結果、上記 Aの条件が満たせなくなります。 このとき、stepスコープ、または、prototypeスコープに指定しなおすことでそのbeanの利用のタイミングで該当のbeanインスタンスを初期化できますが条件 B が満たせなくなります。このような場合にジョブリクエストスコープ部品の利用を検討します。

使用方法

本部品を利用するためには、バッチアプリケーションを下記の手順に従って修正してください。

  1. 以下の一行を「コンテキスト内に一つだけ」記載します。
    <bean class="com.nec.webotx.batch.util.scope.BSJobRequestScope" />
    
  2. スコープを指定したいBeanのscope属性に"jobrequest"を指定します。
    <bean class="SOME_FQCN" scope="jobrequest" />
    
注意事項
関連