将数据从处理器传输到写入器
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 来验证这个概念。
我有一个复合项目处理器,如下所述。我在所有处理器中处理由输入对象表示的项目,输入对象表示我的数据文件中的一行。然而,在处理器 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 来验证这个概念。