2013-06-19 55 views
0

Spring批处理中是否有可能让一个读取器读取数据并将数据拆分为多个编写器进行并行处理?Spring批处理一个读取器多个编写器

步骤: 读者:JdbcCursorItemReader读取100个记录 10并行编剧:每个ItemWriter得到10条记录过程。

我看:

CompositeItemWriter:似乎通过了所有读取项目所有的作家时,我需要平摊项目的作家。

BackToBackPatternClassifier:我并不需要分类器,因为我平均分割项目。

有仅仅有一个阅读器和多个作家的另一种方式?

或者我可以在我的Writer中手动创建线程?

+1

你可能想扔Spring集成到混合,分裂的作业,然后处理,以能够干净,轻松地完成作家的10个不同的实例。如果你愿意,你也可以稍后汇总! –

回答

6

你是什么意思“多个作家”?

什么你正在努力实现好像不是多作家,但与多线程一个作家。

需要明确的是,当我们谈论“多个作家”,我们指的是阅读器读取块,并且需要做不同类型的“写作”为块的。例如你可能有一个从某处读取播放器的PlayerRecordReader,并且你有写入数据库和文件的PlayerDbWriter和PlayerFileWriter。多个写入器不用于分配负载。

对于要并行地完成写作,你需要的是一个作家的情况下(当然,你需要使它线程安全的),并在你的步骤定义使用执行人。 Spring Batch中的这个页面为您提供了清晰的指导。 http://static.springsource.org/spring-batch/reference/html/scalability.html#multithreadedStep

+0

是的,这就是我的意思是多线程。抱歉! 这里有多线程步骤(读者和写作者),并不是特定于作家。我希望读者被称为一个。我选择通过在Runnable(Thread)类的Writer类中调用Writer逻辑来完成此操作。感谢您的回复:) – hajime

+1

你是什么意思?你想要一个块被读取,并且想要同时处理多个同一个块?但为什么?我强烈建议你重新审视你在做什么。我相信有更直接的方式来做到这一点。 –

0

我将Writer逻辑移至Runnable类(Thread类)调用MyWriterRunnable并在MyWriter类中手动将项目List分为10个批次并为每个批次调用MyWriterRunnable。

+1

我会使用可调用接口而不是Runnable。因为你想保留write()方法的throwns Exception。如果你使用> java 6当然! – Cygnusx1

+1

你这样做会造成麻烦。它可能适用于这个特定的情况,但不应该被视为要走的路。最大的问题是写入器逻辑与相应的读取器/处理器逻辑不同。这将导致问题。请使用TaskExecutor采用Spring Batch内置解决方案。 –

+0

@AdrianShum TaskExecutor是一个块,所以读写器都将在Taskexecutor线程下运行吗?我想要的是能够通过1个阅读器并行写入100个读取记录,并且由于我正在1个作者下运行新线程,他们将在1个交易下正确运行? – hajime

0

如果你正在尝试并行处理数据,您将需要分割你的数据和块分配给连接的步骤。您的分区可以像确定每个线程要读取的内容一样简单,或者可以从之前的步骤中读取数据并将其分解为均匀分布的块,并为每个线程的每个读取器分配一个块进行处理。

相关问题