Spring 批处理 - 动态作业选择
Spring Batch - dynamic job selection
我越来越熟悉 Spring 批处理,因为我相信我们的项目需要用它来替换我们当前的代码库(以使开发更快、更容易测试)。
我们当前的代码库具有以下重要特征:
- 一个代码库 - 但有很多批处理(我们在批处理之间重用代码)
- 目前,我们在代码库中有多个 main() 方法,并且只有不同的 shell 脚本来调用正确的 main Class.
我希望在 Spring 批处理中解决以下问题:
我已经根据 Spring 批处理示例开始了一个虚拟的实验项目:https://spring.io/guides/gs/batch-processing/
我想在同一个代码库中保留多个批处理过程(工作,我认为,如果我们谈论 Spring 批处理)。但是,目前,如果我在我的代码中添加更多作业,它们都会被执行。更糟糕的是,我在我的 SpringBoot main class 中添加了一个应用程序侦听器,结果是,作业在 ApplicationReadyEvent 之前执行 - 这对我来说似乎很糟糕,几乎就像 运行构造函数中的业务逻辑。
我的问题是:
- 我如何 select 我想要哪个工作 运行 (基于命令行参数)
- 如何确保作业在 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);
}
我越来越熟悉 Spring 批处理,因为我相信我们的项目需要用它来替换我们当前的代码库(以使开发更快、更容易测试)。
我们当前的代码库具有以下重要特征:
- 一个代码库 - 但有很多批处理(我们在批处理之间重用代码)
- 目前,我们在代码库中有多个 main() 方法,并且只有不同的 shell 脚本来调用正确的 main Class.
我希望在 Spring 批处理中解决以下问题:
我已经根据 Spring 批处理示例开始了一个虚拟的实验项目:https://spring.io/guides/gs/batch-processing/
我想在同一个代码库中保留多个批处理过程(工作,我认为,如果我们谈论 Spring 批处理)。但是,目前,如果我在我的代码中添加更多作业,它们都会被执行。更糟糕的是,我在我的 SpringBoot main class 中添加了一个应用程序侦听器,结果是,作业在 ApplicationReadyEvent 之前执行 - 这对我来说似乎很糟糕,几乎就像 运行构造函数中的业务逻辑。
我的问题是:
- 我如何 select 我想要哪个工作 运行 (基于命令行参数)
- 如何确保作业在 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); }