当读取器发生异常时,不会调用Spring Batch SkipListener

jun*_*sal 6 spring spring-batch

这是我的步骤配置.我的跳过侦听器onSkipInWrite()方法被正确调用.但onSkipInRead()没有被调用.我故意从读者那里抛出空指针异常,从而发现了这一点.

<step id="callService" next="writeUsersAndResources">
        <tasklet allow-start-if-complete="true">
            <chunk reader="Reader" writer="Writer"
                commit-interval="10" skip-limit="10">
                <skippable-exception-classes>
                    <include class="java.lang.Exception" />
                </skippable-exception-classes>
            </chunk>
            <listeners>
                <listener ref="skipListener" />
            </listeners>
        </tasklet>
    </step>
Run Code Online (Sandbox Code Playgroud)

我读了一些论坛,并在两个级别上互换了listeners-tag:在chunk内部,在tasklet之外.没有什么工作......

在这里添加我的跳过侦听器

package com.legal.batch.core;

import org.apache.commons.lang.StringEscapeUtils;
import org.springframework.batch.core.SkipListener;
import org.springframework.jdbc.core.JdbcTemplate;


public class SkipListener implements SkipListener<Object, Object> {


    @Override
    public void onSkipInProcess(Object arg0, Throwable arg1) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onSkipInRead(Throwable arg0) {
    }

    @Override
    public void onSkipInWrite(Object arg0, Throwable arg1) {
}

}
Run Code Online (Sandbox Code Playgroud)

专家请建议

tol*_*ius 12

跳过侦听器遵循事务边界,这意味着它们总是在事务提交之前被调用.

由于示例中的提交间隔设置为"10",因此onSkipInRead将在提交这10个项目时立即调用(一次).

因此,如果您尝试逐步调试,则onSkipInRead在ItemReader抛出异常后,您不会立即看到调用.

SkipListener您的示例中的A 有一个空onSkipInRead方法.尝试在里面添加一些日志记录onSkipInRead,移动并重新运行您的作业以查看这些消息.

编辑:

这是一个工作示例[名称更改为'abc']:

<step id="abcStep" xmlns="http://www.springframework.org/schema/batch">
    <tasklet>
        <chunk writer="abcWriter"
               reader="abcReader"
               commit-interval="${abc.commit.interval}"
               skip-limit="1000" >

            <skippable-exception-classes>
                <include class="com.abc....persistence.mapping.exception.AbcMappingException"/>
                <include class="org.springframework.batch.item.validator.ValidationException"/>
                ...
                <include class="...Exception"/>
            </skippable-exception-classes>

            <listeners>
                <listener ref="abcSkipListener"/>
            </listeners>

        </chunk>

        <listeners>
            <listener ref="abcStepListener"/>
            <listener ref="afterStepStatsListener"/>
        </listeners>

        <no-rollback-exception-classes>
            <include class="com.abc....persistence.mapping.exception.AbcMappingException"/>
            <include class="org.springframework.batch.item.validator.ValidationException"/>
            ...
            <include class="...Exception"/> 
        </no-rollback-exception-classes>

        <transaction-attributes isolation="READ_COMMITTED"
                                propagation="REQUIRED"/>
    </tasklet>
</step>
Run Code Online (Sandbox Code Playgroud)

abcSkipListenerbean 在哪里:

public class AbcSkipListener {

    private static final Logger logger = LoggerFactory.getLogger( "abc-skip-listener" );

    @OnReadError
    public void houstonWeHaveAProblemOnRead( Exception problem ) {
        // ...
    }


    @OnSkipInWrite
    public void houstonWeHaveAProblemOnWrite( AbcHolder abcHolder, Throwable problem ) {
        // ...
    }

    ....
}
Run Code Online (Sandbox Code Playgroud)