我有一个如下所述的复合项目处理器。我处理由输入对象表示的所有处理器中的项目,该对象表示来自我的数据文件的一行。但是,在处理器4中,我对每个项目进行一些计算并将其存储在地图中并将其聚合为整个文件。我想在我的作家中预先设定这张地图。我如何将这张大地图传递给作家?
<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>
请帮忙。
感谢。
答案 0 :(得分:0)
这不是正确的方法,但您可以将其存储到上下文中(例如JobExecutionContext)并稍后检索它。请查看Common Batch Patterns以查看示例(第11.8节)。
这不是一个好的解决方案,因为通过弹簧设计,ItemWriter应该将收到的数据写为ItemProcessor的输出。所以,不要绕过它...
我的建议是创建一个POJO类,包含键和值的字段以及它们的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;
}
}
然后,修改你的&#34; processor4&#34;豆。我不太确定,但如果你使用的是CompositeItemProcessor,那么你的处理器应该有类public class Processor4 implements ItemProcessor<InputObject, OutputObject>
的类签名。
InputObject是您从processor3收到的对象。 OutputObject是您在上面创建的pojo。流程方法的实现应该是这样的:
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来验证这个概念。