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

时间:2012-12-20 10:30:08

标签: spring-batch chunking

我的假设

在我的理解中,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必须从单个输入发出多个输出。这是正确的做法吗?

我对任何最佳实践都很优雅。在此先感谢: - )

2 个答案:

答案 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;加工风格。 (不仅仅是块读取或写入,包括读取,处理和写入的完整过程)

面向块的处理指的是

  1. 使用ItemReader(单项)
  2. 读取项目
  3. 使用ItemProcessor处理它,并聚合结果(结果列表逐个更新)。
  4. 达到提交间隔后,将使用ItemWriter写出整个聚合结果(结果列表),然后提交事务。
  5. 以下是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);