2017-05-29 76 views
1

试图找到这是否曾被问过,但不能。春季批量单线程读取器和多线程写入器

这是问题所在。必须通过Spring批处理实现以下功能 有一个文件需要读取和处理。物品阅读器不是线程安全的。 该计划是让多线程同质处理器和多线程同质作家注入由单线程读取器读取的项目。没有正在执行

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

试过AsyncItemProcessor和AsyncItemWriter,但保持对处理器调试点导致读取器直到点被释放,即单线程处理:

的像下面类。

任务执行受审象下面这样:

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

对读者的多个线程进行启动。

同步阅读器也不起作用。

我试图阅读关于分区器,但它似乎很复杂。

是否有注释将读者标记为单线程?将阅读数据推向全球背景是一个好主意吗?

请指导解决方案。

+0

为什么分区过于复杂? –

+0

感谢您的评论。 我刚看了几分钟,读得越多,就越是感到困惑。 我已经历了它的端到端,它似乎并不是我的问题的传统解决方案,因为我不想分割我的输入。 我错了吗? – Programmer

+0

是SynchronizedItemReader的最佳解决方案吗? – Programmer

回答

0

我想没有什么是在您正在寻找的模式的Spring Batch API中内置的。您需要编写代码来实现您正在寻找的内容。

Method ItemWriter.write已经需要根据您的块大小,以便您可以划分是List到尽可能多的线程,只要你喜欢处理项目的List。您生成自己的线程并将一段列表传递给每个线程来写入。

问题与method ItemProcesor.process(),因为它逐项处理,所以你是由一个单一的项目限制,你将无法一个单一的项目很多的线程。

因此,挑战是编写自己的阅读器,而不是将一个项目列表交给处理器,而不是单个项目,因此您可以并行处理这些项目。&编写器将在列表中工作。

在所有这些设置中,您都必须记住,由您产生的线程将超出read-process-写入Spring批处理的事务边界,因此您必须自行处理这一点 - 从合并所有线程的处理输出并等待所有线程完成并处理任何错误。总而言之,它非常危险。

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

0

跨越此之前手头有类似的问题。

以下是我目前的工作方式。正如@mminella所建议的,与flatfileItemReader同步的itemReader作为委托。这与体面的表现一起工作。该代码目前每秒钟可以写约4K记录,但速度并不完全取决于设计,其他属性也有所贡献。


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

  1. 自定义同步的ItemReader与FlatFileItemReader作为委托进行聚合,但最终导致保持了很多导致性能下降的状态。也许代码需要优化或者同步速度更快。
  2. 解决了每个插入PreparedStatement批处理在不同的线程,但没有增加太多的性能,但我仍然指望在这种情况下,我碰到一个环境中,批处理的个别线程会导致显着的性能提升。