我们正在试验从单线程到多线程的弹簧批处理。
设置相当简单:
- Reader:读取一些特定排序的数据。
- 处理器:获取一些附加值
- Writer:按照读取的顺序将所有数据写入csv文件。
因此我们将阅读器更改为JdbcPagingItemReader
并将排序从
order by firstname, lastname, id;
Map<String, Order> sortConfiguration = new HashMap<>();
sortConfiguration.put("firstname", Order.ASCENDING);
sortConfiguration.put("lastname", Order.ASCENDING);
sortConfiguration.put("id", Order.ASCENDING);
设置commit-interval
为200。
批处理运行良好,但是我们的csv完全出了问题。
我假设spring会在每次提交后写入文件(并希望他按顺序写每页),但混乱程度大于块200行。
我得到了例如行1,3和5应该一起在一个线程和行2和4在另一个线程。
是否有保留顺序的选项或者是放弃多线程的唯一方法?
多线程与排序不兼容。如果使用多线程步骤,则条目将以未定义的顺序进行读取、处理和写入。参考文档的多线程步骤部分提到了这一点:
The result of the above configuration is that the Step executes by reading, processing,
and writing each chunk of items (each commit interval) in a separate thread of execution.
Note that this means there is no fixed order for the items to be processed, and a chunk
might contain items that are non-consecutive compared to the single-threaded case.