Spring批量单线程阅读器和多线程编写器

时间:2017-05-29 15:08:40

标签: spring-batch

试图找出之前是否曾被问过但是不能。

这是问题所在。必须通过Spring批次实现以下内容 有一个文件需要读取和处理。项目阅读器不是线程安全的。 计划是由单线程读取器读取多线程同源处理器和多线程同源编写器injest项目。

有点像下面这样:

        ----------> Processor #1 ----------> Writer #1
       |
    Reader -------> Processor #2 ----------> Writer #2
       |
        ----------> Processor #3 ----------> Writer #3

尝试了AsyncItemProcessor和AsyncItemWriter,但在处理器上保留调试点导致读取器在发布之前没有被执行,即单线程处理。

尝试执行任务程序如下:

<tasklet task-executor="taskExecutor" throttle-limit="20">

启动了阅读器上的多个线程。

同步阅读器也无效。

我试着阅读有关分区程序的内容,但它似乎很复杂。

是否有注释将读者标记为单线程?将读取数据推送到全局上下文是一个好主意吗?

请指导解决方案。

2 个答案:

答案 0 :(得分:0)

我想Spring Batch API中没有内置任何您正在寻找的模式。您需要进行编码才能实现您的目标。

Method ItemWriter.write已根据您的块大小获取List个已处理项目,因此您可以将List划分为任意数量的线程。您生成自己的线程并将一段列表传递给要写入的每个线程。

问题在于method ItemProcesor.process(),因为它逐项处理,因此您受到单个项目的限制,并且您无法对单个项目进行大量线程处理。

挑战在于编写自己的阅读器,而不是将项目列表交给处理器而不是单个项目,这样您就可以并行处理这些项目了。作家将在列表清单上工作。

在所有这些设置中,您必须记住,由您生成的线程将不在读取 - 进程 - 写入Spring批处理的事务边界,因此您必须自己处理 - 在合并方面处理所有线程的输出并等待所有线程完成并处理任何错误。总而言之,这是非常危险的。

Making a item reader to return a list instead single object - Spring batch

答案 1 :(得分:0)

遇到类似的问题时遇到了这个问题。

这就是我现在正在做的事情。正如@mminella建议的那样,使用flatfileItemReader作为委托来同步itemReader。这适用于良好的性能。该代码目前每秒写入大约4K个记录,但速度并不完全取决于设计,其他属性也有贡献。

尝试了其他方法来提高性能,两种方法都失败了。

  1. 自定义同步ItemReader,它与FlatFileItemReader聚合为委托,但我最终维护了很多导致性能下降的状态。也许代码需要优化或同步只是更快。
  2. 在不同的线程中解雇每个插入的PreparedStatement批处理,但没有提高性能,但我仍然指望这个,以防我遇到一个环境,批量的各个线程将导致显着的性能提升。
相关问题