Java 未为跳过的项调用Spring批处理SkipListener
在我的Spring批处理Java 未为跳过的项调用Spring批处理SkipListener,java,spring,spring-batch,Java,Spring,Spring Batch,在我的Spring批处理作业中,我有一个步骤,其中一些错误被跳过。运行之后,我还可以从数据库中看到发生了跳过 问题:跳过的项目从未通过skipListener 我已核实如下: skipListener中的断点永远不会触发 未记录跳过的错误 跳过的错误未添加到我的自定义错误列表中 我还有另一个非常类似的工作,跳过侦听器可以正常工作。我无法在跳过侦听器或作业配置中找到任何显著差异。这些作业甚至共享相同的跳过策略 我尝试将另一个侦听器(ItemProcessListener)添加到步骤中。尽管两个
作业
中,我有一个步骤
,其中一些错误被跳过。运行之后,我还可以从数据库中看到发生了跳过
问题:跳过的项目从未通过skipListener
我已核实如下:
- skipListener中的断点永远不会触发
- 未记录跳过的错误
- 跳过的错误未添加到我的自定义错误列表中
ItemProcessListener
)添加到步骤中。尽管两个监听器的配置方式相同,但它仍然可以完美地工作
这种行为的原因可能是什么
源代码 步骤:
@Bean(name = Beans.STEP)
public Step step(
@Qualifier(Beans.READER) MyBatisCursorItemReader<CustomItem> reader,
CustomItemProcessor processor,
@Qualifier(Beans.WRITER) ItemWriter<CustomItem> writer,
@Qualifier(Beans.SKIP_LISTENER) SkipListener<CustomItem, CustomItem> skipListener,
@Qualifier(Beans.PROCESS_LISTENER) ItemProcessListener<CustomItem, CustomItem> processListener) {
return stepBuilderFactory.get(Beans.STEP)
.<CustomItem, CustomItem> chunk(1)
.reader(reader)
.processor(processor)
.writer(writer)
.faultTolerant()
.skipPolicy(new CustomSkipPolicy())
.listener(skipListener) // doesn't work
.listener(processListener) // does work
.build();
}
您能否共享
CustomSkipPolicy
的代码?我添加了跳过策略代码。但是,我不认为这是问题所在,因为我也尝试了没有skipPolicy的步骤(使用skip()方法),但skipListener仍然没有被触发。是否调用了skip策略?对于异常,它是否返回true?您确定正在从读卡器/处理器/写入程序引发可跳过的异常吗?如果您提供了一个复制问题的方法,我可以尝试提供帮助。是的,将调用skipPolicy并返回true。onProcessError()方法捕获异常,然后转到skipPolicy。将跳过这些错误。我还测试了从skipPolicy返回false,这会导致步骤失败。因此,在听者正常工作之前,一切都是如此。我会考虑添加更多的代码,很难决定要包含什么。
@Bean(name = Beans.PROCESS_LISTENER)
ItemProcessListener<CustomItem, CustomItem> listener() {
return new ItemProcessListener<CustomItem, CustomItem> () {
@Override
public void beforeProcess(CustomItem item) {
log.trace("before process");
}
@Override
public void afterProcess(CustomItem item, CustomItem result) {
log.trace("after process");
}
@Override
public void onProcessError(CustomItem item, Exception e) {
log.trace("on process error");
}
};
}
@Bean(name = Beans.SKIP_LISTENER)
SkipListener<CustomItem, CustomItem> skipListener() {
return new SkipListener<CustomItem, CustomItem>() {
@Override
public void onSkipInRead(Throwable t) {
log.trace("skip on read");
}
@Override
public void onSkipInWrite(CustomItem item, Throwable t) {
log.trace("skip on write");
}
@Override
public void onSkipInProcess(CustomItem item, Throwable t) {
log.trace("skip on process");
}
};
}
public class CustomSkipPolicy extends GeneralBatchSkipPolicy {
@Override
public boolean shouldSkip(Throwable t, int skipCount) {
boolean isSkippable;
// do stuff in between
return isSkippable;
}
}