Spring batch ItemWriteListener和ChunkListner的侦听器问题

Spring batch ItemWriteListener和ChunkListner的侦听器问题,spring-batch,Spring Batch,关于spring批处理块过程中的侦听器,我有一个非常模糊的问题 我的区块配置如下所示: <batch:chunk reader="processMidxDbItemReader" processor="midxItemProcessor" writer="midxCompositeItemWriter" processor-transactional="false" reader-transactional-queue=

关于spring批处理块过程中的侦听器,我有一个非常模糊的问题

我的区块配置如下所示:

<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。 cmabChunkListenerBean实现ChunkListener

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

  • a) 调用“cmabChunkListener”的
    afterChunkError
  • b) 调用“midxProcessSkipListener”的
    onWriteError
但不幸的是,调用了
afterChunkError
方法。
onWriteError
方法被忽略

如果我在配置(见上文)中注释
cmabChunkListener
Bean,那么
midxProcessSkipListener
onWriteError
确实被调用

什么会导致这种行为?为什么在区块过程中不可能有两个独立的侦听器? 我的目标是调用这两种方法

任何帮助都将不胜感激

非常感谢

问候,


出于好奇,Bodo Stockschlaeder

在我的例子中,解决方案是在块配置之外定义侦听器,也就是在批处理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>

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

不过,谢谢你的回复

亲切问候,,
出于好奇,Bodo

在我的例子中,解决方案是在块配置之外定义侦听器,也就是在批处理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>

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

不过,谢谢你的回复

亲切问候,,
Bodo

你能添加堆栈跟踪吗?嗨,我没有任何堆栈跟踪,因为进程没有抛出任何错误。我只是注意到,只要注册了ChunkListener,就不会调用onWriteError方法。这就是我试图理解的问题。你能用
logger.error(“遇到异常”,e)
e.printStackTrace()
记录错误,然后在这里添加输出吗?实际上,如果不以某种方式记录异常,您很少会希望“吃掉”异常。您可以添加堆栈跟踪吗?嗨,我没有任何堆栈跟踪,因为进程不会抛出任何错误。我只是注意到,只要注册了ChunkListener,就不会调用onWriteError方法。这就是我试图理解的问题。你能用
logger.error(“遇到异常”,e)
e.printStackTrace()
记录错误,然后在这里添加输出吗?实际上,如果不以某种方式记录异常,您很少会希望“吃掉”异常