【问题标题】:why spring batch creates a new instance when i try to restart the day after a failed job?为什么当我尝试在作业失败后的第二天重新启动时,spring batch 会创建一个新实例?
【发布时间】:2016-03-15 13:45:53
【问题描述】:

image datas from database

我在 2016 年 3 月 14 日的存储库中有一个失败的执行实例。

如果我尝试在 2016 年 3 月 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...");

    }

}

【问题讨论】:

  • 我们可以查看您用于启动作业的代码(以及作业的配置)吗?
  • 非常感谢您的帮助迈克尔,谢谢。告诉我您是否需要更高的精度。
  • 所以这是我的问题。每个作业实例存储在作业存储库中的作业参数是什么?它们有什么不同,如果有,有什么区别?作业参数指示是否应创建新的 JobInstance。因此,如果在上述代码的某个地方,您在重启时传入了新的或不同的参数,您将获得一个新的 JobInstance。
  • 我添加了一张显示 bdd 数据的图片。我有相同的参数,但有 2 个实例

标签: spring-batch


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-01-20
    • 2015-10-11
    • 2021-06-15
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2018-04-25
    • 2020-05-26
    • 2020-06-10
    相关资源
    最近更新 更多