试图找出之前是否曾被问过但是不能。
这是问题所在。必须通过Spring批次实现以下内容 有一个文件需要读取和处理。项目阅读器不是线程安全的。 计划是由单线程读取器读取多线程同源处理器和多线程同源编写器injest项目。
有点像下面这样:
----------> Processor #1 ----------> Writer #1
|
Reader -------> Processor #2 ----------> Writer #2
|
----------> Processor #3 ----------> Writer #3
尝试了AsyncItemProcessor和AsyncItemWriter,但在处理器上保留调试点导致读取器在发布之前没有被执行,即单线程处理。
尝试执行任务程序如下:
<tasklet task-executor="taskExecutor" throttle-limit="20">
启动了阅读器上的多个线程。
同步阅读器也无效。
我试着阅读有关分区程序的内容,但它似乎很复杂。
是否有注释将读者标记为单线程?将读取数据推送到全局上下文是一个好主意吗?
请指导解决方案。
答案 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个记录,但速度并不完全取决于设计,其他属性也有贡献。
尝试了其他方法来提高性能,两种方法都失败了。