しおしお

IntelliJのあれやこれや

JBeretのカスタムなCDIスコープを試す

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