Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未为跳过的项调用Spring批处理SkipListener_Java_Spring_Spring Batch - Fatal编程技术网

Java 未为跳过的项调用Spring批处理SkipListener

Java 未为跳过的项调用Spring批处理SkipListener,java,spring,spring-batch,Java,Spring,Spring Batch,在我的Spring批处理作业中,我有一个步骤,其中一些错误被跳过。运行之后,我还可以从数据库中看到发生了跳过 问题:跳过的项目从未通过skipListener 我已核实如下: skipListener中的断点永远不会触发 未记录跳过的错误 跳过的错误未添加到我的自定义错误列表中 我还有另一个非常类似的工作,跳过侦听器可以正常工作。我无法在跳过侦听器或作业配置中找到任何显著差异。这些作业甚至共享相同的跳过策略 我尝试将另一个侦听器(ItemProcessListener)添加到步骤中。尽管两个

在我的Spring批处理
作业
中,我有一个
步骤
,其中一些错误被跳过。运行之后,我还可以从数据库中看到发生了跳过

问题:跳过的项目从未通过
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;
    }
}