Spring 批处理 - 动态作业选择

Spring Batch - dynamic job selection

我越来越熟悉 Spring 批处理,因为我相信我们的项目需要用它来替换我们当前的代码库(以使开发更快、更容易测试)。

我们当前的代码库具有以下重要特征:

我希望在 Spring 批处理中解决以下问题:

我已经根据 Spring 批处理示例开始了一个虚拟的实验项目:https://spring.io/guides/gs/batch-processing/

我想在同一个代码库中保留多个批处理过程(工作,我认为,如果我们谈论 Spring 批处理)。但是,目前,如果我在我的代码中添加更多作业,它们都会被执行。更糟糕的是,我在我的 SpringBoot main class 中添加了一个应用程序侦听器,结果是,作业在 ApplicationReadyEvent 之前执行 - 这对我来说似乎很糟糕,几乎就像 运行构造函数中的业务逻辑。

我的问题是:

提前致谢。

有各种各样的问题。

1。 要禁用在启动时自动启动所有作业,只需配置此 Spring Boot property:

spring.batch.job.enabled=false # Do not execute all Spring Batch jobs in the context on startup.

2。 你会 运行 这样的工作:

java -Dspring.batch.job.names=prepareTeaJob -jar target/0910-job-parameters-cli-0.0.2-SNAPSHOT.jar sugarAmount="no sugar"

糖量有Job参数。属于此列表的完整示例托管在 my Github Repository here 中。顺便说一句,如果您正在学习 Spring 批处理 Spring 批处理主题,还有更多示例涵盖这些不同的 Spring 批处理主题。

3。 不确定您所说的 "ApplicationReadyEvent" 是什么。 AFAIK 作业应在 Spring 上下文完全初始化后执行。

我的解决方案如下:

  • 将 spring.batch.job.enabled 属性 设置为 false - 这会阻止作业在设置上下文时启动

  • 从上下文中获取 JobLauncher 并 运行 我自己的任何作业:

    SpringApplication app = new SpringApplication(BatchProcessingServiceStarter.class);
    app.setWebEnvironment(false); 
    
    ConfigurableApplicationContext ctx=app.run(args);
    JobLauncher jobLauncher = ctx.getBean(JobLauncher.class);
    JobParameters jobParameters = new JobParametersBuilder()
        .addDate("date", new Date())
        .toJobParameters();  
    
    if(!"1".equals(args[0])){       
        jobLauncher.run(ctx.getBean("BatchConfiguration2", Job.class), jobParameters);                   
    } else {
        jobLauncher.run(ctx.getBean("BatchConfiguration1",  Job.class), jobParameters);   
    }