试图找到之前是否被问到但是不能 .
这是问题所在 . 必须通过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 回答
我想在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
遇到了类似的问题 .
这就是我现在正在做的事情 . 正如@mminella建议的那样,使用flatfileItemReader作为委托来同步itemReader . 这适用于良好的性能 . 该代码目前每秒写入约4K个记录,但速度并不完全取决于设计,其他属性也有贡献 .
尝试了其他方法来提高性能,两种方式都失败了 .
自定义同步ItemReader,它与FlatFileItemReader聚合为委托,但我最终维护了很多导致性能下降的状态 . 也许代码需要优化或同步只是更快 .
在不同的线程中,每个插入PreparedStatement批处理,但没有提高性能,但我仍然指望这个,以防我遇到一个环境,批量的各个线程将导致显着的性能提升 .