Spring Batch - 动态工作选择

时间:2016-03-19 08:41:01

标签: java spring spring-boot spring-batch

我熟悉Spring Batch,因为我相信这是我们的项目需要替换我们当前的代码库(使开发更快更容易测试)。

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

  • 一个代码库 - 但是很多批处理过程(我们在批处理过程之间重用代码)
  • 目前,我们在代码库中有多个main()方法,只是有不同的shell脚本来调用正确的主类。

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

我已经开始了一个基于Spring Batch示例的虚拟试验项目:https://spring.io/guides/gs/batch-processing/

我想在同一个代码库中保留多个批处理过程(如果我们谈论Spring Batch,我会采取工作)。但是,目前,如果我添加更多Job sin我的代码,所有这些都会被执行。更糟糕的是,我在SpringBoot主类中添加了一个Application Listener,事实证明,在ApplicationReadyEvent之前执行了Jobs - 这对我来说似乎很糟糕,就像在构造函数中运行业务逻辑一样。

我的问题是:

  • 如何选择我想要运行的作业(基于命令行参数)
  • 如何确保在ApplicationReadyEvent
  • 之后启动作业

提前致谢。

2 个答案:

答案 0 :(得分:1)

有各种各样的问题。

1。 要在启动时自动禁用所有作业,请配置此following-sibling

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参数。属于此商家信息的完整示例托管在Spring Boot property中。顺便说一下,如果您正在学习Spring Batch,还有更多的例子涵盖了这些不同的Spring Batch主题。

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

答案 1 :(得分:0)

我的解决方案如下:

  • 将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);   
    }