是否有可能在 Spring 季批次中让一个读取器读取数据并将数据拆分为多个写入器以进行并行处理?
Steps: Reader:JdbcCursorItemReader读取100条记录10条并行写入器:每个ItemWriter获取10条记录进行处理 .
我看过:
CompositeItemWriter :当我需要将项目均匀地分配给作者时,似乎将所有读取的项目传递给所有作者 .
BackToBackPatternClassifier :我没有't really need a classifier because I' m均匀分割物品 .
还有另外一种只有一个读者和多个作者的方法吗?
或者我可以在我的Writer中手动创建线程?
3 回答
“多位作家”是什么意思?
您要实现的目标似乎不是多个编写器,而是具有多线程的单个编写器 .
需要说明的是,当我们谈论“多重作家”时,我们的意思是读者阅读一个大块,并且需要为大块做不同类型的“写作” . 例如你可能有一个从某个地方读取Player的PlayerRecordReader,你有PlayerDbWriter和PlayerFileWriter写入DB和File . 多个写入器不用于分配负载 .
对于您希望并行完成写入的情况,您需要的是单个编写器(当然您需要使其成为线程安全的)并在步骤定义中使用 Actuator . Spring Batch中的这个页面为您提供了如何执行此操作的明确说明 . http://static.springsource.org/spring-batch/reference/html/scalability.html#multithreadedStep
我将我的Writer逻辑移动到Runnable类(Thread类),调用MyWriterRunnable,在MyWriter类中,我手动将项目List拆分为10个批次,并为每个批次调用MyWriterRunnable .
如果您尝试并行处理数据,则需要对数据进行分区并将块分配给链接的步骤 . 您的分区可以像确定每个线程读取的内容一样简单,也可以从上一步中读取已读取的数据,并将它们分解为均匀分布的块,并为每个线程的每个读者分配一个块进行处理 .