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)