1

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

希望这能解决我的问题。

4

1 回答 1

3

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

  1. ItemProcessorListener在你周围被调用,CompositeItemProcessor而不是在它的委托ItemProcessors周围被调用
  2. CompositeItemProcessListener会遇到一个ClassCastException因为是签名必须是CompositeItemProcessListener<User,HashSet<Object>>并且接收时HashSet<String>会抛出异常

您必须以另一种方式解决,这取决于您的需求;我只会为您的问题提供一个想法,但您也可以重新考虑您的设计以达到相同的结果

我的想法:
将中间转换后的数据存储在 中StepExecutionContext,编写自己的ItemProcessorListener,将每个中间结果委托给SoDDataProcessorListenerSoDLogicProcessorListener如果您(将)拥有更多数据并将数据分配给正确的侦听器,则其他人;通过这种方式,您还可以编写特定的类来保持侦听器分离。

希望能有所帮助。

于 2013-08-24T13:43:25.087 回答