我正在使用Spring批处理。 我有2个项目处理器,用于执行处理逻辑。
我已经为ItemReader和ItemWriter配置了监听器。
我使用过Spring Batch CompositeItemProcessor(org.springframework.batch.item.support.CompositeItemProcessor)。
我的工作配置如下: -
<job id="SoDJob" xmlns="http://www.springframework.org/schema/batch">
<step id="step1">
<tasklet>
<chunk reader="itemReader" processor="SoDConflictProcessor" writer="SoDConflictExcelWriter"
commit-interval="1" />
<listeners>
<listener ref="sodJobListener" />
<listener ref="SoDItemReaderListener" />
<listener ref="SoDItemWriterListener" />
</listeners>
</tasklet>
</step>
</job>
我的处理器配置为: -
<bean id="SoDConflictProcessor"
class="org.springframework.batch.item.support.CompositeItemProcessor">
<property name="delegates">
<list>
<ref bean="SoDDataProcessor" />
<ref bean="SoDLogicProcessor" />
</list>
</property>
</bean>
如何为ItemProcessor(SoDDataProcessor和SoDLogicProcessor)编写单独的ItemProcessListener。
仅供参考:
1)SoDDataProcessor - 实现ItemProcessor<User, HashSet<String>>
。
2)SoDLogicProcessor - 实现ItemProcessor<HashSet<String>, HashSet<Object>>
希望这能解决我的问题。
答案 0 :(得分:3)
有一个CompositeItemProcessListener
,但这不符合您的要求,因为 - 我认为 - 您的请求是SoDDataProcessorListener
在SoDDataProcessor
处理项目时调用SoDLogicProcessorListener
当项目从上一步转换为SoDLogicProcessor
时调用
这是不可能的,原因有两个:
ItemProcessorListener
会围绕您的CompositeItemProcessor
进行调用,而不是围绕其委派的ItemProcessor
进行调用
CompositeItemProcessListener
将遇到ClassCastException
,因为签名必须为CompositeItemProcessListener<User,HashSet<Object>>
,并且在收到HashSet<String>
时会引发异常你必须以另一种方式解决,这取决于你的需要;我会给你一个关于你的问题的想法,但你也可以重新考虑你的设计以达到同样的结果
我的想法:
将中间转换的数据存储在StepExecutionContext
中,编写自己的ItemProcessorListener
,将每个中间结果委派给SoDDataProcessorListener
,SoDLogicProcessorListener
和其他人,如果您(将)拥有更多并调度数据以进行更正侦听器;通过这种方式,您还可以编写特定的类来分隔隐藏的侦听器。