为ItemProcessors链实现ItemProcessListener

时间:2013-08-24 10:51:14

标签: spring-batch

我正在使用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>>

希望这能解决我的问题。

1 个答案:

答案 0 :(得分:3)

有一个CompositeItemProcessListener,但这不符合您的要求,因为 - 我认为 - 您的请求是SoDDataProcessorListenerSoDDataProcessor处理项目时调用SoDLogicProcessorListener当项目从上一步转换为SoDLogicProcessor时调用 这是不可能的,原因有两个:

    {li> ItemProcessorListener会围绕您的CompositeItemProcessor进行调用,而不是围绕其委派的ItemProcessor 进行调用
  1. CompositeItemProcessListener将遇到ClassCastException,因为签名必须为CompositeItemProcessListener<User,HashSet<Object>>,并且在收到HashSet<String>时会引发异常
  2. 你必须以另一种方式解决,这取决于你的需要;我会给你一个关于你的问题的想法,但你也可以重新考虑你的设计以达到同样的结果

    我的想法:
    将中间转换的数据存储在StepExecutionContext中,编写自己的ItemProcessorListener,将每个中间结果委派给SoDDataProcessorListenerSoDLogicProcessorListener和其他人,如果您(将)拥有更多并调度数据以进行更正侦听器;通过这种方式,您还可以编写特定的类来分隔隐藏的侦听器。

    希望可以提供帮助。