Spring batch Spring批处理中的块读取-不仅仅是块写入 我的假设

Spring batch Spring批处理中的块读取-不仅仅是块写入 我的假设,spring-batch,chunking,Spring Batch,Chunking,据我所知,SpringBatch中的“面向块的处理”帮助我在一个事务中高效地处理多个项目。这包括有效使用来自外部系统的接口。由于外部通信包括开销,因此它也应该受到限制并面向块。这就是为什么我们有ItemWriter的提交级别。 所以我不明白的是,为什么ItemReader仍然需要逐项阅读?为什么我不能同时阅读块呢 问题描述 在我的步骤中,读者必须调用Web服务。作者将把这些信息发送到另一个Web服务。这就是为什么我不想打必要的电话 ItemWriter的界面是面向块的-您肯定知道: public

据我所知,SpringBatch中的“面向块的处理”帮助我在一个事务中高效地处理多个项目。这包括有效使用来自外部系统的接口。由于外部通信包括开销,因此它也应该受到限制并面向块。这就是为什么我们有
ItemWriter
的提交级别。 所以我不明白的是,为什么
ItemReader
仍然需要逐项阅读?为什么我不能同时阅读块呢

问题描述 在我的步骤中,读者必须调用Web服务。作者将把这些信息发送到另一个Web服务。这就是为什么我不想打必要的电话

ItemWriter
的界面是面向块的-您肯定知道:

public abstract void write(List<? extends T> paramList) throws Exception;
作为一种解决方法,我实现了一个
ChunkBufferingItemReader
,它读取项目列表,存储它们,并在调用其
read()
方法时逐个返回项目

但现在,当涉及到异常处理和重新启动作业时,这种方法变得越来越混乱。我感觉我在这里工作,框架应该为我做这些。

问题: 那么我是不是错过了什么?Spring Batch中是否有我刚才忽略的功能?

在中,建议将
ItemReader
的返回类型更改为
列表
。但是我的
ItemProcessor
必须从一个输入发出多个输出。这是正确的方法吗


对于任何最佳实践,我都很优雅。提前感谢:-)

Spring批处理使用“面向块”的处理方式。(不仅仅是块读或写,全过程包括读、处理和写)

面向块的处理是指

  • 使用ItemReader读取项目(单个项目)
  • 使用ItemProcessor对其进行处理,并聚合结果(结果列表将逐个更新)
  • 一旦达到提交间隔,使用ItemWriter写出整个聚合结果(结果列表),然后提交事务
  • 以下是SpringBatch文档中的代码表示

    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 items=new Arraylist();
    for(int i=0;i
    正如您所说,如果您需要阅读器返回多个项目,请将其设置为列表。如果处理器也返回一个列表。最后,您的作者将获得一个列表的列表

    下面是新案例的代码表示

    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);
    
    List resultList=new Arraylist();
    for(int i=0;i
    这是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();
    }
    
    public T read()引发异常{
    while(this.items.isEmpty()){
    最终列表newItems=readChunk();
    if(newItems==null){
    返回null;
    }
    this.items.addAll(newItems);
    }
    返回此.items.pop();
    }
    

    请注意,
    items
    是一个缓冲区,用于分块读取并且框架尚未请求的项。

    感谢您详细的回答。不过,我还是怀疑物品清单是否有效。那么,我如何利用SpringBatch的回退机制呢?如果在处理块的过程中出现异常,SpringBatch将切换到单一处理。这再也不行了。我仍然认为Spring Batch在这里缺少一个功能。从读卡器返回列表也有一个缺点,即您无法通过在处理器中返回null来轻松筛选项(因此它实际上被计算为已筛选项),并且诸如readCount、writeCount、,filterCount等表示的不是项目数,而是项目列表数。
    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();
    }