Spring BootでJSR-352 Batch Applications for the Java Platform

やること

Spring Batchのリファレンスに記載の方法で起動すると、@Serviceなどのコンポーネントを参照してくれない。

JobOperator jobOperator = BatchRuntime.getJobOperator();
long jobExecutionId = jobOperator.start("myJob", new Properties());

batch.xmlに以下のように記載しておくことで、DIできるが、Spring Bootらしくない。

<bean id="myService" class="com.example.batch.MyService" />

なんとかして、Spring Bootらしくバッチを書く。

調査

BatchRuntime.getJobOperatorすると、JsrJobOperatorのデフォルトコンストラクターが実行される。 このコンストラクターの長で、BaseContextHolderが呼ばれ、GenericXmlApplicationContextがjsrBaseContext.xmlを読み込んでいた。 JobOperator#startで、META-INF/batch.xml、META-INF/batch-jobs/*.xmlを読み込んでいる。 このため、XMLに定義したBeanは使える。

解決案

JsrJobOperatorは以下のようなコンストラクターも持っているため、そちらを使うようにする。

public JsrJobOperator(JobExplorer jobExplorer, JobRepository jobRepository, JobParametersConverter jobParametersConverter, PlatformTransactionManager transactionManager)

Spring Boot + JSR-352