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




