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

时间:2016-08-25 15:05:31

标签: spring spring-batch spring-retry

我有以下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);,但它不起作用。

2 个答案:

答案 0 :(得分:1)

将重试拦截器配置为bean并在 class SomeClass : public QObject{ Q_OBJECT public: ... void someFunction(){ Parent* c = getChildObject(); //some call to get the Object of class Child QObject::connect(c, &Parent::test, this, &SomeClass::handle_test); //QObject::connect: signal not found in Child } } public slots: void handle_test(){ //do something } } 属性中指定它;有一个interceptor来帮助组装bean。

您可以将reoverer添加到拦截器中,该拦截器在重试耗尽后调用。

答案 1 :(得分:0)

您可以为您的读者应用可跳过的例外类,以便Spring Batch不会失败。

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

Nghia酒店