在我的理解中,Spring Batch中的“面向块的处理”帮助我在单个事务中有效地处理多个项目。这包括有效使用外部系统的接口。由于外部通信包括开销,因此它应该是有限的并且也是面向块的。这就是为什么我们有ItemWriter
的提交级别。
所以我没有得到的是,为什么ItemReader
仍然必须逐项阅读?为什么我也不能阅读块?
在我的步骤中,读者必须调用web服务。作者将此信息发送到另一个Web服务。这就是为什么我不想做必要的呼叫。
ItemWriter
的界面是面向块的 - 正如您所知道的那样:
public abstract void write(List<? extends T> paramList) throws Exception;
但ItemReader
不是:
public abstract T read() throws Exception;
作为一种解决方法,我实现了一个ChunkBufferingItemReader
,它读取项目列表,存储它们并在调用read()
方法时逐个返回项目。
但是现在谈到异常处理和重新启动工作时,这种方法变得混乱了。我感觉我在这里工作,框架应该为我做。
我错过了什么? Spring Batch中是否有任何现有的功能我只是忽略了?
在another post中,建议将ItemReader
的返回类型更改为List
。但是我的ItemProcessor
必须从单个输入发出多个输出。这是正确的做法吗?
我对任何最佳实践都很优雅。在此先感谢: - )
答案 0 :(得分:4)
这是read()接口方法的实现草案。
public T read() throws Exception {
while (this.items.isEmpty()) {
final List<T> newItems = readChunk();
if (newItems == null) {
return null;
}
this.items.addAll(newItems);
}
return this.items.pop();
}
请注意,items
是用于以块读取的项目的缓冲区,而框架尚未请求。
答案 1 :(得分:0)
Spring Batch使用&Chunk Oriented&#39;加工风格。 (不仅仅是块读取或写入,包括读取,处理和写入的完整过程)
面向块的处理指的是
以下是SpringBatch doc
的代码表示List items = new Arraylist();
for(int i = 0; i < commitInterval; i++){
Object item = itemReader.read()
Object processedItem = itemProcessor.process(item);
items.add(processedItem);
}
itemWriter.write(items);
正如您所说,如果您需要读者返回多个项目,请将其设为列表。如果您的处理器还返回列表。最后,您的作家将获得列表清单。
以下是新案例的代码表示
List<List<Object>> resultList = new Arraylist<List<Object>>();
for(int i = 0; i < commitInterval; i++){
List<Object> items = itemReader.read()
List<Object> processedItems = itemProcessor.process(items);
resultList.add(processedItems);
}
itemWriter.write(resultList);