我是相当新的Spring Batch的,并具有以下要求:
- 读取一个文件的百万记录的minumum (CSV,管道分隔符等)
- 将文件中的每一行加载到一个Map with key作为第一列,并将值作为域对象/ POJO加载。
据我所知,Spring批处理有一种称为面向块的处理,其中一个配置读取器,处理器和一个写入器来处理由commit-interval支配的一定数量的记录。这可以进一步使用读者的任务执行程序或通过分区添加另一层多线程进行扩展。
问题
如在2点以上解释,我想我的文件加载到地图。为了讨论的缘故,可以说我实现了下面的ItemWriter,它将块聚合到一个Map中。
public class MapItemWriter implements ItemWriter<SomePOJO> {
private Map<String, SomePOJO> somePojoMap;
public MapItemWriter() {
System.out.println("Writer created ");
somePojoMap= new ConcurrentHashMap<String, SomePOJO>();
}
public void write(List<? extends SomePOJO> item) throws Exception {
if (item != null && item.size() > 0) {
for (SomePOJO data : item) {
String uniqueId = data.Id();
somePojoMap.put(uniqueId, data);
}
}
}
public Map<String, SomePojo> getSomePojoMap() {
return somePojoMap;
}
}
因为我有机会到我的ItemWriter豆,我可以再打getSomePojoMap得到汇总图在我的档案记录;然而,在ItemWriter中持有像这样的Map并不觉得这是最好的方式。另一个问题是,使用ConcurrentHashMap可能会降低性能,但我没有看到任何其他方式可以以线程安全的方式将文件聚合到Map中。
有没有更好的方法来将我的文件聚合到一个Map中,而不是在我的writer中保存一个Map并使用ConcurrentHashMap?
为什么要将数据加载到地图中?地图填充后会发生什么? –
@MichaelPralow我们有一个遗留系统,它将文件中的数据加载到一个Map中(每个文件一个)。我们想用Spring批次替换数据加载层。这些映射用于汇聚层,该汇聚层将来自不同映射的数据聚合为在另一个系统侦听的JMS队列上发送的主对象。我们不想更改聚合层,因为这意味着要修改整个遗留系统。我们希望提高数据加载性能。如果我们保持与汇聚层的接口相同,它可以继续工作,就好像没有任何变化。 – CKing