首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么当我尝试在失败作业后的第二天重新启动时,spring批处理会创建一个新实例?

问为什么当我尝试在失败作业后的第二天重新启动时,spring批处理会创建一个新实例?
EN

Stack Overflow用户
提问于 2016-03-15 13:45:53
回答 1查看 667关注 0票数 1

数据库图像数据

我的存储库中有一个失败的执行实例,日期为2016-03-14。

如果我试图在2016-03-15的日期重新启动作业的实例,就会创建一个新的实例和一个具有前一个作业参数(2016-03-14)的新执行程序。

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

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

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

编辑:我从以下代码开始我的工作:

代码语言:javascript
复制
 `@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

以及步骤配置:

代码语言:javascript
复制
@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();
}

我有一个新的实例,然后是一个空的执行上下文,因此无法检测到重新启动。

我也用弹簧靴。发射

代码语言:javascript
复制
@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...");

    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-11 13:54:47

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36013102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档