ItemWriteListener和ChunkListner的监听器问题

时间:2016-07-19 12:09:55

标签: spring-batch

我有一个关于春季批处理块过程中听众的一个非常模糊的问题。

我的块配置如下:

<batch:chunk
       reader="processMidxDbItemReader"
       processor="midxItemProcessor"
       writer="midxCompositeItemWriter"
       processor-transactional="false"
       reader-transactional-queue="false"
       skip-limit="${cmab.batch.skip.limit}"
       commit-interval="#{jobParameters['toProcess']==T(de.axa.batch.ecmcm.cmab.util.CmabConstants).TYPE_POSTAUSGANG ? '${consumer.global.pa.midx.readCount}' : '${consumer.global.pe.midx.readCount}' }"
       cache-capacity="20">
    <batch:skippable-exception-classes>
        <batch:include class="de.axa.batch.ecmcm.cmab.util.CmabProcessMidxException" />
    </batch:skippable-exception-classes>
    <batch:retryable-exception-classes>
        <batch:include class="de.axa.batch.ecmcm.cmab.util.CmabTechnicalMidxException" />
        <batch:include class="de.axa.batch.ecmcm.cmab.util.CmabTechnicalException" />
    </batch:retryable-exception-classes>
    <batch:retry-listeners>
        <batch:listener ref="logRetryListener"/>
    </batch:retry-listeners>
    <batch:listeners>
        <batch:listener>
            <bean id="midxProcessSkipListener" class="de.axa.batch.ecmcm.cmab.core.batch.listener.CmabDbSkipListener" scope="step">
                <constructor-arg index="0" value="#{jobParameters['errorStatus']}" type="java.lang.String"/>
            </bean>
        </batch:listener>
        <batch:listener>
            <bean id="cmabChunkListener" class="de.axa.batch.ecmcm.cmab.core.batch.listener.CmabChunkListener" scope="step"/>
        </batch:listener>
    </batch:listeners>
</batch:chunk>

midxProcessSkipListener 使用所有覆盖方法实现ItemProcessListener和ItemWriteListener。 cmabChunkListener Bean实现了ChunkListener。

那么我的问题是什么: 如果发生写入错误,我会期望......

  • a)&#34; cmabChunkListener的afterChunkError&#34;被称为
  • b)&#34; midxProcessSkipListener&#34; onWriteError被称为。

但遗憾的是只是调用了afterChunkError方法。忽略onWriteError方法?!?

如果我在我的配置中评论cmabChunkListener Bean(见上文),那么onWriteError的{​​{1}}确实被调用。

什么可能导致这种行为?为什么在Chunk进程中有两个单独的监听器是不可能的呢? 我的目标是调用两个方法。

非常感谢任何帮助。

非常感谢提前。

此致

Bodo Stockschlaeder

1 个答案:

答案 0 :(得分:0)

出于好奇:我的解决方案是从块配置中定义监听器,这意味着在批处理tasklet中。

                    </batch:chunk>
                    <batch:listeners>
                        <batch:listener ref="midxStepListener"/>
                        <batch:listener>
                            <bean id="cmabChunkListener" class="de.axa.batch.ecmcm.cmab.core.batch.listener.CmabChunkListener" scope="step"/>
                        </batch:listener>
                    </batch:listeners>
             </batch:tasklet>
      </batch:step>

此解决方案对我有用: - )

尽管如此,感谢您的回复。

亲切的问候, 博多