我创建了一个弹簧批处理作业,读取平面CSV文件的块(提交级别= 10)并将输出写入另一个平面文件。干净利落。 为了测试本地扩展,我还使用一个包含10个线程池的TaskExecutor配置了该任务,从而通过使用多线程步骤模式引入了并行性。 正如预期的那样,这些线程同时读取项目,直到它们的块被填充并且块被写入输出文件。 也如预期的那样,由于这种并发读取,项目的顺序已经改变。 但是有可能保持固定顺序,最好还是利用通过使用多线程获得的性能提升?弹簧批量多线程作业与固定订单
回答
我想不出一个简单的方法。解决方法是在读取时按顺序创建的所有行加上前缀。完成作业后,按id排序行。听起来很不舒服,但应该工作。
我无法看到如何使用ID前缀项目以在并发阅读期间维持顺序。用ID前缀项目意味着连续阅读imo? – nkr1pt
很明显,读者线程必须使用相同的共享计数器实例。类似于['AtomicLong.incrementAndGet()'](http://download.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicLong.html#incrementAndGet%28%29),其中所有线程共享一个AtomicLong实例。 –
我不认为有什么简单的解决方案,但只使用一个写线程(也进行排序写入时)和多线程读取可以工作,但它不会是可扩展的..
这意味着首先应该按照Sean Patrick Floyd的建议为它们加上一个ID作为前缀,以便我们稍后可以在写入之前在内存中对它们进行排序。但是因为这些项目是同时读取的,所以我们不能在阅读时提供订单,这应该在一个顺序过程中完成? – nkr1pt
- 1. 弹簧启动应用与弹簧批量不运行作业
- 2. 在弹簧批处理作业中使用多线程步骤
- 3. 弹簧批量并行作业缩放
- 4. 重新加载弹簧批量作业
- 5. 多个弹簧批处理作业
- 6. 多线程Lucene索引作家与弹簧批
- 7. JDBC使用弹簧批处理作业
- 8. 弹簧启动弹簧批量分配作业在完成后不停止
- 9. 从春季批次访问远程弹簧批量作业管理员
- 10. IndexOutOfBoundsException弹簧批量和弹簧启动
- 11. 启动时弹簧批量集成作业实例已存在
- 12. 务实或通过xml创建x个弹簧批量作业
- 13. 具有多个作业和xml文件的弹簧批处理
- 14. 如何使用弹簧批次运行多个作业
- 15. 多弹簧与弹簧JPA
- 16. 弹簧批量策略
- 17. 在弹簧引导应用程序中调度多个批处理作业
- 18. 弹簧批处理数据的多线程处理
- 19. 如何在另一个作业中制作异步弹簧批作业
- 20. 具有多个表格的弹簧批量远程分区
- 21. 在完成弹簧批处理作业之前返回作业ID“立即”
- 22. 输入文件的弹簧批量定制分区程序
- 23. 弹簧注释@Transactional多线程
- 24. 多线程弹簧启动控制器
- 25. 弹簧批处理作家父子表数据批量加载
- 26. 弹簧+线程安全单例
- 27. 监视弹簧批处理作业的进度
- 28. kubernetes上的可扩展弹簧批处理作业
- 29. 记录跳过相同的弹簧批处理作业
- 30. 运行特定的弹簧批处理作业包含弹簧引导脂肪罐
嗨,我有同样的问题。我分别为读写器使用了FlatFileItemReader和FlatFileItemWriter。但两者都不是线程安全的。我曾尝试使用TaskExecutor,但重做并不合适。行和列的顺序不正确。你可以请你发布你的解决方案。我指的是您使用的读写器,以及用于写操作顺序的破解。 – Saurabh
嗨@ nkr1pt你能帮忙吗? – Saurabh