这是我的步骤配置。我的跳过监听器 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> 

我阅读了一些论坛并在两个级别交换了 listeners-tag:块内部和 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) { 
} 
 
} 

请专家建议

请您参考如下方法:

跳过监听器尊重事务边界,这意味着它们总是在事务提交之前被调用。

由于您示例中的提交间隔设置为“10”,因此 onSkipInRead将在提交这 10 项(一次)时立即调用。

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

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

编辑 :

这是一个工作示例 [名称更改为 '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> 

哪里 abcSkipListener bean 是:
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 ) { 
        // ... 
    } 
 
    .... 
} 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!