Spring Batch中的块读取 - 不仅是块写入

Pet*_*ann 5 chunking spring-batch

我的假设

在我的理解中,Spring Batch中的"面向块的处理"帮助我在单个事务中有效地处理多个项目.这包括有效使用外部系统的接口.由于外部通信包括开销,因此它应该是有限的并且也是面向块的.这就是为什么我们有提交级别的原因ItemWriter.所以我没有得到的是,为什么ItemReader仍然必须逐项阅读?为什么我也不能读块呢?

问题描述

在我的步骤中,读者必须调用web服务.作者将此信息发送到另一个Web服务.这就是为什么我不想做必要的电话.

接口ItemWriter是面向块的 - 正如您所知道的那样:

public abstract void write(List<? extends T> paramList) throws Exception;
Run Code Online (Sandbox Code Playgroud)

但事实ItemReader并非如此:

public abstract T read() throws Exception;
Run Code Online (Sandbox Code Playgroud)

作为一种解决方法,我实现了一个ChunkBufferingItemReader读取项目列表的方法,存储它们并在read()调用方法时逐个返回项目.

但是当谈到异常处理和现在重新开始工作时,这种方法变得混乱.我感觉我在这里工作,框架应该为我做.

我错过了什么吗?Spring Batch中是否存在任何现有功能?

另一篇文章中,建议将a的返回类型更改ItemReader为a List.但是我ItemProcessor必须从单个输入发出多个输出.这是正确的方法吗?

我对任何最佳实践都很优雅.提前致谢 :-)

Pet*_*ann 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();
}
Run Code Online (Sandbox Code Playgroud)

请注意,这items是一个用于以块的形式读取且框架尚未请求的项目的缓冲区。