spring-boot - Spring Batch 5 不会自动启 Action 业

标签 spring-boot spring-batch

我正在将作业从 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并覆盖getDataSourcegetTransactionManager 。我假设我可以使用诸如 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/

相关文章:

hibernate - 创建函数 - UncategorizedScriptException - ArrayIndexOutOfBoundsException

java - 即使在 Spring boot 中传递了 args 之后,也使用 applicationContext 调用 noArgs 构造函数创建 bean

spring - 如何为每个 block 创建多个文件(csv)?

java - spring boot 无法连接非主数据库

java - spring.main.allow-bean-definition-overriding=true 是一种不好的做法吗

java - fastxml.jackson.databind 无效定义异常

java - Spring Batch JobExecutionException - ConcurrencyFailureException

java - 如何使用不同的参数同时启动同一个 spring-batch 作业?

java - Spring 批处理中平面文件中的空格问题

spring-batch - @springBatchTest 没有数据源错误