🔖

Spring Batch 5系へ移行したときの話

2023/12/14に公開

Spring Boot / Batchを、それぞれ3系、5系に移行したときに気になったことついて書きたいと思います。

主な構成

  • JDK: 17.0.6
  • Kotlin: 1.9.10
  • Spring Boot: 3.1.2
  • Spring Batch: 5.1.2

メタテーブルを置き換える

https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-Guide#removed-apis こちらに記載があるように、MapJobRepositoryFactoryBeanが削除されるため、今までこちらを用いてメタテーブルを利用していた場合は、他の手段を用いる必要があります。

ここでは、H2を利用する例を示します。

以下を追加します。

build.gradle.kts
runtimeOnly("com.h2database:h2")

次に、DataSource定義用ファイルに以下を記載します。ソースコードは例です。

@Primary
@Bean
fun mainDataSource(): DataSource {
  return SimpleDriverDataSource().also {
    it.driver = Class.forName(properties.driverClassName).getDeclaredConstructor().newInstance() as? Driver
    it.url = properties.main.url
    it.username = properties.main.username
    it.password = properties.main.password
  }
}

@BatchDataSource
@Bean
fun metaDataSource(): DataSource {
  return EmbeddedDatabaseBuilder()
    .setType(EmbeddedDatabaseType.H2)
    .addScript("classpath:org/springframework/batch/core/schema-drop-h2.sql")
    .addScript("classpath:org/springframework/batch/core/schema-h2.sql")
    .build()
}

@EnableBatchProcessing is now discouraged
Previously, @EnableBatchProcessing could be used to enable Spring Boot’s auto-configuration of Spring Batch. It is no longer required and should be removed from applications that want to use Boot’s auto-configuration. A bean that is annotated with @EnableBatchProcessing or that extends Batch’s DefaultBatchConfiguration can now be defined to tell the auto-configuration to back off, allowing the application to take complete control of how Batch is configured.

こちらにあるように、特にカスタマイズせず、Spring Batchの自動設定を利用するには@EnableBatchProcessingは不要です。

メタデータ管理用のデータソースがDataSource Beanとなっていて、メインDBのデータソースが使われない場合は@EnableBatchProcessingを削除してみると良さそうです。
https://github.com/spring-projects/spring-batch/issues/3942

Jobの指定方法を変更する

Multiple Batch Jobs
Running multiple batch jobs is no longer supported. If the auto-configuration detects a single job is, it will be executed on startup. If multiple jobs are found in the context, a job name to execute on startup must be supplied by the user using the spring.batch.job.name property.

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#multiple-batch-jobs

以下に例を示します。

- $ java -jar hoge.jar --spring.batch.job.names=SampleJob --spring.batch.job.enabled=true
+ $ java -jar hoge.jar --spring.batch.job.name=SampleJob --spring.batch.job.enabled=true

最後に

他にも変更点が色々あるので、詳細はMigration Guideを参照ください。

参考

Discussion