当我尝试在失败的工作后重新开始工作时,为什么spring批处理会创建一个新实例?

image datas from database

我在2016-03-14日期间在我的存储库中有一个失败的执行实例 .

如果我尝试在2016-03-15的日期重新启动作业的实例,则会创建一个新实例和带有上一个作业参数(2016-03-14)的新执行 .

但是这项工作正在重新启动一个完整的步骤,而不是执行恢复过程(从失败事件之前的最后一行开始) .

为什么我有一个新的实例?

如果我在同一天重新启动(失败的作业和重新启动的作业)我没有问题(一个实例在作业执行之间共享) .

编辑:我用这段代码开始我的工作:

@Bean public Job myJob(JobBuilderFactory jobs, Step stepInjectCsvWsIntoCsv) { return jobs.get("myJob") .listener(new JobListener()) .incrementer(new RunIdDateIncrementor()) .flow(stepInjectCsvWsIntoCsv) .end().build(); }

RunIdDateIncrementor是我自己的类 . 我在这里创建参数(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...");

    }

}

回答(1)

2 years ago

好吧,这是我的坏事 . 为了在前一天测试错误事件,我在数据库中请求更新所有日期 . 因此,batch_instance中的序列化密钥不再匹配 . 如果我在前一天更改系统日期以生成错误,那么如果我在第二天重新启动,则所有工作都会完美 .