将数据从处理器传输到写入器

Transferring Data from Processor to Writer

我有一个复合项目处理器,如下所述。我在所有处理器中处理由输入对象表示的项目,输入对象表示我的数据文件中的一行。然而,在处理器 4 中,我对每个项目进行了一些计算,并将其存储在地图中并为整个文件聚合。我想在我的作家中保留这张地图。怎么把这张大地图传给Writer?

<bean id="myProcessors"
        class="org.springframework.batch.item.support.CompositeItemProcessor"
        scope="step">
        <property name="delegates">
            <util:list>
                <ref bean="processor1" />
                <ref bean="processor2" />
                <ref bean="processor3" />
                <ref bean="processor4" />
            </util:list>
        </property>
    </bean>

请帮忙。

谢谢。

这不是正确的方法,但您可以将其存储到上下文中(例如 JobExecutionContext)并在以后检索它。查看 Common Batch Patterns 以查看示例(第 11.8 节)。

这不是一个好的解决方案,因为根据 springbatch 设计,ItemWriter 应该写入接收到的数据作为 ItemProcessor 的输出。所以,不要绕过它...

我的建议是创建一个 POJO class,其中包含键和值字段以及它们的 getter/setter。这样,处理器 4 可以将您的地图转换为列表。因此,作者可以收到List<? extends Object>并自然地处理它。

--编辑:按要求补充

我写的代码没有测试,所以要小心。

像下面这样创建一个 pojo。

public class OutputObject {
    private Map myMap;

    public Object getMyMap() {
        return myMap;
    }

    public void setMyMap(Map myMap) {
        this.myMap= myMap;
    }
}

然后,修改您的 "processor4" bean。我不太确定,但如果您使用的是 CompositeItemProcessor,您的处理器应该有一个 class 签名,例如 public class Processor4 implements ItemProcessor<InputObject, OutputObject>.

InputObject 是您从处理器 3 收到的对象。 OutputObject 是您在上面创建的 pojo。 process方法的实现应该是这样的:

public OutputObject process(InputObject item) throws Exception {

   ...
   Map myMap = ....
   OutputObject out = new OutputObject();
   out.setMyMap(myMap);
   return out;
}

最后,你的 ItemWriter#writer 应该是这样的:

public void write(List<? extends OutputObject> items) throws Exception {
   ...
   Map myMap = items.get(0);
   ...
}

就是这样。正如我所说,我没有测试。因此,请先验证所有内容。写一个 POC 来验证这个概念。