为什么 spring 当我尝试在作业失败后的第二天重新启动时批处理创建一个新实例?
why spring batch creates a new instance when i try to restart the day after a failed job?
2016 年 3 月 14 日我的存储库中有一个失败的执行实例。
如果我尝试在 2016 年 3 月 15 日重新启动作业的实例,则会创建一个新实例和一个使用先前作业参数 (2016 年 3 月 14 日) 的新执行。
但是作业正在重新启动一个完整的步骤,而不是执行恢复过程(从失败事件之前的最后一行开始)。
为什么我有一个新实例?
如果我在同一天重新启动(失败的作业和重新启动的作业)我没有问题(作业执行之间共享一个实例)。
编辑:
我用这段代码开始我的工作:
@Bean
public Job myJob(JobBuilderFactory jobs, Step stepInjectCsvWsIntoCsv) {
return jobs.get("myJob")
.listener(new JobListener())
.incrementer(new RunIdDateIncrementor())
.flow(stepInjectCsvWsIntoCsv)
.end().build();
}
RunIdDateIncrementor 是我自己的class。我在这里创建参数(run.id 和 run.date)
我使用 FlatItemReader 和 CompositeWriter,它们管理两个 MultiResourceItemWriter 并实现 ResourceAwareItemWriterItemStream
以及步骤配置:
@Bean(name = "stepInjectCsvWsIntoCsv")
public Step stepInjectCsvWsIntoCsv(StepBuilderFactory stepBuilderFactory, ItemReader<GetDataInCsv> csvReader,
CompositeTwoCsvFileItemWriter getDataWriter,
ItemProcessor<GetDataInCsv, List<GetDataOutCsv>> getDataProcessor
) {
/* it handles bunches of 10 units => limité à 10 stations*/
return stepBuilderFactory.get("stepInjectCsvWsIntoCsv").listener(new StepListener())
.<GetDataInCsv, List<GetDataOutCsv>> chunk(1)
.reader(csvReader).processor(getDataProcessor).writer(getDataWriter)
.faultTolerant().skipLimit(1000).skip(GetDataFault.class)
.listener(new CustomChunkListener())
.listener(new CustomItemReaderListener())
.listener(new GetDataItemProcessListener())
.listener(new CustomItemWriterListener())
.build();
}
我有一个新实例,然后是一个空的执行上下文,因此未检测到重新启动。
我也用SPRING BOOT。
发射
@SpringBootApplication
public class BatchWsVersCsv implements CommandLineRunner {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(BatchWsVersCsv.class);
SpringApplication springApplication = new SpringApplication(new Object[] { BatchWsVersCsv.class });
Map<String, Object> defaultProperties = new HashMap<String, Object>();
//set some default properties
//...
springApplication.setDefaultProperties(defaultProperties);
springApplication.run(args);
}
public void run(String... strings) throws Exception {
System.out.println("running...");
}
}
好吧,是我的错。为了在前一天测试错误事件,我在数据库中请求更新所有日期。
因此 batch_instance 中的序列化密钥不再匹配。
如果我在前一天更改系统日期以生成错误,如果我 运行 后一天重新启动,一切都会正常工作。
2016 年 3 月 14 日我的存储库中有一个失败的执行实例。
如果我尝试在 2016 年 3 月 15 日重新启动作业的实例,则会创建一个新实例和一个使用先前作业参数 (2016 年 3 月 14 日) 的新执行。
但是作业正在重新启动一个完整的步骤,而不是执行恢复过程(从失败事件之前的最后一行开始)。
为什么我有一个新实例?
如果我在同一天重新启动(失败的作业和重新启动的作业)我没有问题(作业执行之间共享一个实例)。
编辑: 我用这段代码开始我的工作:
@Bean
public Job myJob(JobBuilderFactory jobs, Step stepInjectCsvWsIntoCsv) {
return jobs.get("myJob")
.listener(new JobListener())
.incrementer(new RunIdDateIncrementor())
.flow(stepInjectCsvWsIntoCsv)
.end().build();
}
RunIdDateIncrementor 是我自己的class。我在这里创建参数(run.id 和 run.date)
我使用 FlatItemReader 和 CompositeWriter,它们管理两个 MultiResourceItemWriter 并实现 ResourceAwareItemWriterItemStream
以及步骤配置:
@Bean(name = "stepInjectCsvWsIntoCsv")
public Step stepInjectCsvWsIntoCsv(StepBuilderFactory stepBuilderFactory, ItemReader<GetDataInCsv> csvReader,
CompositeTwoCsvFileItemWriter getDataWriter,
ItemProcessor<GetDataInCsv, List<GetDataOutCsv>> getDataProcessor
) {
/* it handles bunches of 10 units => limité à 10 stations*/
return stepBuilderFactory.get("stepInjectCsvWsIntoCsv").listener(new StepListener())
.<GetDataInCsv, List<GetDataOutCsv>> chunk(1)
.reader(csvReader).processor(getDataProcessor).writer(getDataWriter)
.faultTolerant().skipLimit(1000).skip(GetDataFault.class)
.listener(new CustomChunkListener())
.listener(new CustomItemReaderListener())
.listener(new GetDataItemProcessListener())
.listener(new CustomItemWriterListener())
.build();
}
我有一个新实例,然后是一个空的执行上下文,因此未检测到重新启动。
我也用SPRING BOOT。 发射
@SpringBootApplication
public class BatchWsVersCsv implements CommandLineRunner {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(BatchWsVersCsv.class);
SpringApplication springApplication = new SpringApplication(new Object[] { BatchWsVersCsv.class });
Map<String, Object> defaultProperties = new HashMap<String, Object>();
//set some default properties
//...
springApplication.setDefaultProperties(defaultProperties);
springApplication.run(args);
}
public void run(String... strings) throws Exception {
System.out.println("running...");
}
}
好吧,是我的错。为了在前一天测试错误事件,我在数据库中请求更新所有日期。 因此 batch_instance 中的序列化密钥不再匹配。 如果我在前一天更改系统日期以生成错误,如果我 运行 后一天重新启动,一切都会正常工作。