【问题标题】:Spring Batch: ItemProcessor does not process all recordsSpring Batch:ItemProcessor 不处理所有记录
【发布时间】:2018-10-24 05:10:53
【问题描述】:

我的批处理作业没有处理所有读取记录。

完成工作后,Spring Batch 记录读取 198282 记录,但在处理器中,我在开始处理之前有一个日志,只记录 196503 ,但有时,处理器处理所有。

我在油门限制 = 20 的多线程中运行作业,但有时我会遇到这个问题,而不是全部处理。

ItemReader: JpaPagingItemReader with saveState = false

ItemProcessor:

class MyProcessor implements ItemProcessor<Item, Item> {

    @Override
    public Item process(final Item item) {
        log.info("action=process..");
        ....
    }
}

会发生什么? Spring Batch 没有将所有记录发送到处理,或者我在使用多线程时做错了什么?

工作

@Bean
public Job myJob (Step myStep) {
    return jobBuilderFactory.get("myJob")
            .start(myStep)
            .build();
}

步骤

@Bean
public Step consolidateTaxaRebateJobStep (
        JpaPagingItemReader<Item> reader,
        ItemProcessor<Item, Item> processor,
        ItemWriter<Item> writer,
        TaskExecutor taskExecutor) {
    return stepBuilderFactory.get("myStep")
            .<Item, Item>chunk(200)
            .reader(reader)
            .processor(processor)
            .writer(writer)
            .taskExecutor(taskExecutor)
            .throttleLimit(20)
            .build();
}

Spring Boot 版本: 2.0.1

【问题讨论】:

  • 只是一个猜测 - 也许读者正在抛出异常并且您正在记录重试。步骤是如何配置的?如何记录项目?贴一些代码!
  • @AndrewS 读者和工作正在完成,没有任何失败/异常。我添加了作业和步骤配置。我有一个监听器,我从 JobExecution 获得读取计数,并且我在处理器方法的第一行有一个日志。
  • JpaPagingItemReaders 祖先AbstractItemCountingItemStreamItemReader.read() 不是线程安全的,所以currentItemCount++ 可能会导致问题。但是如果saveState 真的是假的,那么在作业结束时读取计数应该是 0。尝试单步执行代码以查看读取计数的更新位置并验证它是线程安全的。或者也许包装 JpaPagingItemReader 并在委托之前同步读取方法。
  • @AndrewS 我已经尝试过使用 SynchronizedItemStreamReader 使我的阅读器同步,但问题仍然存在。阅读我的所有记录,但不处理所有记录。

标签: java spring multithreading spring-boot spring-batch


【解决方案1】:

问题是我有一个异常监听器,当一些记录抛出异常时,块中的所有记录都被跳过。

【讨论】:

    猜你喜欢
    • 2020-02-12
    • 2017-08-07
    • 1970-01-01
    • 2021-09-20
    • 2015-08-11
    • 2015-09-15
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多