【问题标题】:Spring Batch - dynamic job selectionSpring Batch - 动态作业选择
【发布时间】:2016-03-19 08:41:00
【问题描述】:
我越来越熟悉 Spring Batch,因为我相信我们的项目需要用它来替换我们当前的代码库(以使开发更快、更容易测试)。
我们当前的代码库具有以下重要特征:
- 一个代码库 - 但有很多批处理(我们在批处理之间重用代码)
- 目前,我们在代码库中有多个 main() 方法,只是有不同的 shell 脚本来调用正确的主类。
我希望在 Spring 批处理中解决以下问题:
我已经开始了一个基于 Spring Batch 示例的虚拟实验项目:https://spring.io/guides/gs/batch-processing/
我想在同一个代码库中保留多个批处理(如果我们谈论 Spring Batch,我会选择作业)。但是,目前,如果我在我的代码中添加更多作业,它们都会被执行。更糟糕的是,我在 SpringBoot 主类中添加了一个应用程序侦听器,结果发现,作业在 ApplicationReadyEvent 之前执行 - 这对我来说似乎很糟糕,几乎就像在构造函数中运行业务逻辑一样。
我的问题是:
- 如何选择要运行的作业(基于命令行参数)
- 如何确保作业在 ApplicationReadyEvent 之后启动
提前致谢。
【问题讨论】:
标签:
java
spring
spring-boot
spring-batch
【解决方案1】:
有各种各样的问题。
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 Batch,还有更多涵盖这些 Spring Batch 主题的示例。
3。
不确定您所说的“ApplicationReadyEvent”是什么。 AFAIK 作业应在 Spring 上下文完全初始化后执行。
【解决方案2】:
我的解决方案如下:
将 spring.batch.job.enabled 属性设置为 false - 这会阻止作业在设置上下文时启动
-
让 JobLauncher 脱离上下文并自己运行任何 Job:
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);
}