java - 使用 modules=true 配置时,在 SpringBatch 中调用了两次作业
问题描述
我正在尝试将 Spring Batch 用于工作。我在两个单独的配置中有两个工作 tempJob 和 tempJob2。当尝试使用命令行参数(-Dspring.batch.job.names=tempJob)运行 tempJob 时,SpringBatch 尝试运行 tempJob 两次,我收到以下错误
2018-06-15 11:36:37.956 INFO 14436 --- [main] osbclsupport.SimpleJobLauncher:作业:[SimpleJob:[name=tempJob]] 使用以下参数完成:[{TimeStamp=06152018 11:36:30} ] 和以下状态:[COMPLETED] 2018-06-15 11:36:38.049 INFO 14436 --- [main] ConditionEvaluationReportLoggingListener:
启动 ApplicationContext 时出错。要显示条件报告,请在启用“调试”的情况下重新运行您的应用程序。2018-06-15 11:36:38.058 错误 14436 --- [main] osboot.SpringApplication
:应用程序运行失败22) [classes/:na] 原因:org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException:作业实例已存在且已完成参数={TimeStamp=06152018 11:36:30}。如果要再次运行此作业,请更改参数。在 org.springframework.batch.core.repository.support.SimpleJobRepository.createJobExecution(SimpleJobRepository.java:130) ~ [spring-batch-core-4.0.1.RELEASE.jar:4.0.1.RELEASE] 在 sun.reflect。 NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_60] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_60] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java :43) ~[na:1.8.0_60] at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_60] at org.springframework.aop。
2018-06-15 11:36:38.060 INFO 14436 --- [main] scaAnnotationConfigApplicationContext:关闭 org.springframework.context.annotation.AnnotationConfigApplicationContext@770c2e6b:启动日期 [Fri Jun 15 11:36:31 EDT 2018];上下文层次结构的根 2018-06-15 11:36:38.061 INFO 14436 --- [main] oscsupport.DefaultLifecycleProcessor:在阶段停止 bean -2147482648 2018-06-15 11:36:38.062 INFO 14436 --- [main] ory$ResourceAnnotationApplicationContext:关闭 ResourceAnnotationApplicationContext:com.example.springbatchdemo.config.TempConfig 2018-06-15 11:36:38.063 INFO 14436 --- [main] ory$ResourceAnnotationApplicationContext:关闭 ResourceAnnotationApplicationContext:com.example.springbatchdemo.config.TempConfig2 2018-06-15 11:36:38。
main] osjeaAnnotationMBeanExporter:取消注册 JMX 公开的 bean 2018-06-15 11:36:38.065 INFO 14436 --- [
main] com.zaxxer.hikari.HikariDataSource:HikariPool-1 - 启动关闭... 2018-06-15 11 :36:38.098 INFO 14436 --- [
主] com.zaxxer.hikari.HikariDataSource:HikariPool-1 - 关闭完成。
以下是我的 Spring Batch 配置这是我的主要课程
@SpringBootApplication
@EnableBatchProcessing(modular=true)
public class SpringbatchdemoApplication {
public static void main(String[] args) {
String[] params = addTimestampAsParameter(args);
SpringApplication.run(SpringbatchdemoApplication.class, params);
}
@Bean
public ApplicationContextFactory runTempJob1() {
return new GenericApplicationContextFactory(TempConfig.class);
}
@Bean
public ApplicationContextFactory runTempJob2() {
return new GenericApplicationContextFactory(TempConfig2.class);
}
public static String[] addTimestampAsParameter(final String[] args){
String[] params = null;
if(null != args){
params = new String[args.length+1];
for(int i=0;i<args.length;i++){
params[i]=args[i];
}
}else{
params = new String[1];
}
SimpleDateFormat sdf = new SimpleDateFormat("MMddyyyy hh:mm:ss");
String timeStamp = sdf.format(new Date());
params[params.length-1] = String.format("TimeStamp=%s", timeStamp);
return params;
}
}
以下是我的配置类
@Configuration
public class TempConfig {
@Autowired
JobBuilderFactory jobBuilder;
@Autowired
StepBuilderFactory stepBuilder;
@Bean
public Tasklet sampleTask(){
return new Tasklet() {
@Override
public RepeatStatus execute(StepContribution arg0, ChunkContext arg1) throws Exception {
System.out.println("Executed Temp Step of TempConfig Job -> TempJob");
return RepeatStatus.FINISHED;
}
};
}
@Bean
public Step tempStep(Tasklet sampleTask){
return stepBuilder.get("tempStep").tasklet(sampleTask).build();
}
@Bean
public Job tempJob(){
return jobBuilder.get("tempJob")
.start(tempStep(null))
.build();
}
}
和第二个作业配置
@Configuration
public class TempConfig2 {
@Autowired
JobBuilderFactory jobBuilder;
@Autowired
StepBuilderFactory stepBuilder;
@Bean
public Step tempStep1(){
return stepBuilder.get("tempStep1").tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution arg0, ChunkContext arg1) throws Exception {
System.out.println("Executed Temp Step of TempConfig2 Job -> TempJob1");
return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Job tempJob1(){
return jobBuilder.get("tempJob1")
.start(tempStep1())
.build();
}
}
当我进一步研究时发现,在给 -Dspring.batch.job.names SpringBatch 使用 JobLauncherCommandLineRunner.launchJobFromProperties() 方法来执行作业。此方法尝试使用 executeLocalJobs(jobParameters) 和 executeRegisteredJobs(jobParameters) 执行作业;在调试时,我发现两种方法都在执行我的工作。
是否有任何解决方案可以使用带有(modular = true)的命令行参数只运行一次作业。如果您需要更多信息,请提供帮助并告知。
解决方案
正如@akhil-khandelwal 所说,(modular=true)
从@EnableBatchProcessing
注释中删除可以解决问题。它为我解决了。
推荐阅读
- r - 如何迭代函数中的条目以创建两个新的字符向量
- json - powershell load json 迭代并使用键和值
- java - 为 Selenium 测试实现一个全局监听器
- javascript - Electron 无法为 Windows 编译
- go - golang-migrate 在初始迁移时没有更改错误
- bash - 从 bash shell 脚本中运行排除选择性文件
- visual-studio - 尝试重新安装 Visual Studio 2019 时出错
- docker - 如何正确设置基本的 traefik 反向代理?
- python - 当涉及 Flask 时,使用自定义格式进行日志记录,抛出“ValueError:在记录中找不到格式化字段”
- android - Android“app:titleTextColor”在 CollapsingToolbarLayout 内的 MaterialToolbar 中不起作用