如何在超过@Retryable maxAttempts 后捕获Spring Batch 的ItemStreamException?

How to catch Spring Batch's ItemStreamException after @Retryable maxAttempts exceeded?

我有以下 ItemReader:

import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemStreamException;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.LineMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;

@Service
public class MyReader extends FlatFileItemReader<Holding> {

    @Autowired
    public MyReader(LineMapper<Holding> lineMapper, File loadFile) {
        setResource(new FileSystemResource(loadFile));
        final int NUMBER_OF_HEADER_LINES = 1;
        setLinesToSkip(NUMBER_OF_HEADER_LINES);
        setLineMapper(lineMapper);
    }

    @Override
    @Retryable(value=ItemStreamException.class, maxAttempts=5,  backoff=@Backoff(delay=1800000))
    public void open(ExecutionContext executionContext) throws ItemStreamException {
                super.open(executionContext);
    }
}

第 5 次尝试后,如果 loadFile 不存在,将抛出 ItemStreamException。我怎样才能捕捉到这个异常?

我想通过向管理员发送电子邮件来处理此异常。我试过用 try catch 子句围绕 jobLauncher.run(job, jobParameters); 但它不起作用。

将重试拦截器配置为bean,并在interceptor 属性中指定;有一个 RetryInterceptorBuilder 可以帮助组装 bean。

你可以在重试次数耗尽后调用的拦截器中添加一个恢复器。

您可以为您的 reader 应用 skippable-exception-类 这样 Spring 批处理就不会失败。

如果发送电子邮件失败,我建议您使用 Job Listener 而不是 try/catch。

恩吉亚