2011-08-19 94 views
2

我创建了一个弹簧批处理作业,读取平面CSV文件的块(提交级别= 10)并将输出写入另一个平面文件。干净利落。 为了测试本地扩展,我还使用一个包含10个线程池的TaskExecutor配置了该任务,从而通过使用多线程步骤模式引入了并行性。 正如预期的那样,这些线程同时读取项目,直到它们的块被填充并且块被写入输出文件。 也如预期的那样,由于这种并发读取,项目的顺序已经改变。 但是有可能保持固定顺序,最好还是利用通过使用多线程获得的性能提升?弹簧批量多线程作业与固定订单

+0

嗨,我有同样的问题。我分别为读写器使用了FlatFileItemReader和FlatFileItemWriter。但两者都不是线程安全的。我曾尝试使用TaskExecutor,但重做并不合适。行和列的顺序不正确。你可以请你发布你的解决方案。我指的是您使用的读写器,以及用于写操作顺序的破解。 – Saurabh

+0

嗨@ nkr1pt你能帮忙吗? – Saurabh

回答

1

我想不出一个简单的方法。解决方法是在读取时按顺序创建的所有行加上前缀。完成作业后,按id排序行。听起来很不舒服,但应该工作。

+0

我无法看到如何使用ID前缀项目以在并发阅读期间维持顺序。用ID前缀项目意味着连续阅读imo? – nkr1pt

+2

很明显,读者线程必须使用相同的共享计数器实例。类似于['AtomicLong.incrementAndGet()'](http://download.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicLong.html#incrementAndGet%28%29),其中所有线程共享一个AtomicLong实例。 –

0

我不认为有什么简单的解决方案,但只使用一个写线程(也进行排序写入时)和多线程读取可以工作,但它不会是可扩展的..

+0

这意味着首先应该按照Sean Patrick Floyd的建议为它们加上一个ID作为前缀,以便我们稍后可以在写入之前在内存中对它们进行排序。但是因为这些项目是同时读取的,所以我们不能在阅读时提供订单,这应该在一个顺序过程中完成? – nkr1pt