我正在将作业从 Spring Boot 2 升级到 Spring Boot 3,这也会将 Spring Batch 升级到 Spring Batch 5。
我遇到了作业不再自动启动的问题。这不是计划的或异步的作业,它只是作为 jar 运行。如果可能的话,我最好会像这样运行它(在以前的版本中运行良好):
java -jar MyJobApp.jar --batch.input-file="/path/to/file/filename.xml" --spring.config.additional-location=file:/path/to/config/externalPropertyFile.yml
我有自己的数据库表用于记录批处理状态等,因此我需要将作业配置为根本不使用默认批处理表,或者只是将它们粘贴到内存中D b。我通过 JobListener 保留我需要的内容。
Spring 迁移指南提到了“现在可以定义使用 @EnableBatchProcessing 注释或扩展 Batch 的 DefaultBatchConfiguration 的 bean 来告诉自动配置退出,允许应用程序完全控制 Batch 的配置方式。”
我假设这就是问题所在,但正如前面提到的,我需要配置一个特定于 JobRepository 的数据源,并且我不确定如何在不使用任何这些配置选项的情况下实现此目的。
我当前的设置是这样的:
@EnableConfigurationProperties(BatchProps::class, WebClientProps::class)
@SpringBootApplication
class MyJobApp
fun main(args: Array<String>) {
exitProcess(SpringApplication.exit(runApplication<MyJobApp>(*args)))
}
spring:
main:
web-application-type: none
application:
name: MyJobApp
batch:
job:
enabled: true
@Configuration
@EnableBatchProcessing(dataSourceRef = "batchDataSource", transactionManagerRef = "batchTransactionManager")
class BatchConfig(
private val reader: PackageDataReader,
private val processor: PackageDataProcessor,
private val writer: OrderWriter,
) {
@Bean
fun job(listener: JobNotificationListener,
jobRepository: JobRepository,
transactionManager: PlatformTransactionManager,
ioStep: Step): Job = JobBuilder(JOB_NAME, jobRepository)
.listener(listener)
.flow(ioStep)
.end()
.build()
@Bean
fun ioStep(jobRepository: JobRepository, transactionManager: PlatformTransactionManager): Step = StepBuilder(STEP_NAME, jobRepository)
.chunk<PackageData, List<OrderType>>(1, transactionManager)
.reader(reader)
.processor(processor)
.writer(writer)
.build()
// We don't want the spring batch metadata tables in our db, so we just stick these into an in-memory db
@Bean
fun batchDataSource(): DataSource {
return EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2)
.addScript("/org/springframework/batch/core/schema-h2.sql")
.generateUniqueName(true).build()
}
@Bean
fun batchTransactionManager(): JdbcTransactionManager? {
return JdbcTransactionManager(batchDataSource())
}
}
我尝试使用EnableBatchProcessing
以声明方式配置它,并且我尝试扩展DefaultBatchConfigurer
并覆盖getDataSource
和getTransactionManager
。我假设我可以使用诸如 CommandLineRunner 之类的东西通过 Autowiring 的 JobLauncher 手动启 Action 业,但这感觉不是正确的方法。该作业在我的集成测试中运行良好,该测试通过 JobLauncherTestUtils
使用 SimpleJobLauncher
。
运行作业时的日志:
2023-03-03T11:17:05.041+01:00 DEBUG 20592 --- [ main] MyJobApp : Running with Spring Boot v3.0.2, Spring v6.0.4
2023-03-03T11:17:05.041+01:00 INFO 20592 --- [ main] MyJobApp : The following 1 profile is active: "dev"
2023-03-03T11:17:05.611+01:00 INFO 20592 --- [ main] o.s.b.c.c.annotation.BatchRegistrar : Finished Spring Batch infrastructure beans configuration in 6 ms.
2023-03-03T11:17:07.133+01:00 INFO 20592 --- [ main] o.s.j.d.e.EmbeddedDatabaseFactory : Starting embedded database: url='jdbc:h2:mem:3df4e81c-eff0-45fc-a9f2-9b97f721b113;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'
2023-03-03T11:17:07.433+01:00 INFO 20592 --- [ main] o.s.b.c.r.s.JobRepositoryFactoryBean : No database type set, using meta data indicating: H2
2023-03-03T11:17:07.499+01:00 INFO 20592 --- [ main] .c.a.BatchObservabilityBeanPostProcessor : No Micrometer observation registry found, defaulting to ObservationRegistry.NOOP
2023-03-03T11:17:07.513+01:00 INFO 20592 --- [ main] .c.a.BatchObservabilityBeanPostProcessor : No Micrometer observation registry found, defaulting to ObservationRegistry.NOOP
2023-03-03T11:17:07.519+01:00 INFO 20592 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : No TaskExecutor has been set, defaulting to synchronous executor.
2023-03-03T11:17:07.743+01:00 INFO 20592 --- [ main] MyJobbApp : Started MyJobApp in 3.28 seconds (process running for 4.247)
2023-03-03T11:17:07.755+01:00 INFO 20592 --- [ main] o.s.j.d.e.EmbeddedDatabaseFactory : Shutting down embedded database: url='jdbc:h2:mem:3df4e81c-eff0-45fc-a9f2-9b97f721b113;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false'
Process finished with exit code 0
如有任何帮助,我们将不胜感激。
最佳答案
这是正确的。在 Spring Boot 3 中,添加 @EnableBatchProcessing
或扩展 DefaultBatchConfiguration
时会禁用批量自动配置(包括启动时自动执行作业)。
关于spring-boot - Spring Batch 5 不会自动启 Action 业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75626317/