JBeret1.2から追加されたカスタムCDIスコープを試してみた。
JBeretのバージョン
compile 'org.jberet:jberet-core:1.2.2.Final'
StepScope
1つのStepがスコープとなるので、同一ステップ内であれば同じBeanのインスタンスが使用される。
Stepが変わるとBeanのインスタンスが新しく生成される。
StepScopeのBean
StepScopeにするために、org.jberet.cdi.StepScopedアノテーションを設定する。
@StepScoped @Named open class SampleBean { open var count: Int = 0; }
Beanを使うBatchlet
StepScopeなBeanをインジェクションし、Beanの内容の出力と値をインクリメントする。
@Named @Dependent class SampleBatchlet @Inject constructor( private val sampleBean: SampleBean ) : AbstractBatchlet() { override fun process(): String { println("batchlet: ${sampleBean.count}") sampleBean.count++ return "success" } }
Beanを使うStepListener
StepScopeなBeanをインジェクションし、ステップの実行前に値のインクリメントを行いステップの実行後に値の出力を行う。
@Dependent @Named open class SampleStepListener @Inject constructor( private val stepContext: StepContext, private val sampleBean: SampleBean ) : AbstractStepListener() { override fun beforeStep() { println("---------- ${stepContext.stepName} ----------") sampleBean.count++ } override fun afterStep() { println("after step = ${sampleBean.count}") } }
Job定義
StepごとにBeanが新しくなっていることを確認するために、同じBatchletを繰り返し実行する。
<step id="myStep" next="myStep2"> <listeners> <listener ref="sampleStepListener" /> </listeners> <batchlet ref="sampleBatchlet"> </batchlet> </step> <step id="myStep2" next="myStep3"> <listeners> <listener ref="sampleStepListener" /> </listeners> <batchlet ref="sampleBatchlet"> </batchlet> </step> <step id="myStep3"> <listeners> <listener ref="sampleStepListener" /> </listeners> <batchlet ref="sampleBatchlet"> </batchlet> </step>
実行結果
Stepが変わるごとにBeanが新しくなって、値が初期化されている。
同一ステップ内のListenerとBatchletでは同じBeanが使用されていることがわかる。
---------- myStep ---------- batchlet: 1 after step = 2 ---------- myStep2 ---------- batchlet: 1 after step = 2 ---------- myStep3 ---------- batchlet: 1 after step = 2
StepScope以外・・・
Step以外には、JOBやPartitionスコープがある。
詳細はこちら→Custom CDI Scopes | JBeret User Guide