首页 > 解决方案 > 创建重试模板以重试连接超时和读取超时

问题描述

我在我的 spring boot 应用程序中集成了一个 rest 模板。其余模板成功建立连接和读取超时。我还集成了一个重试模板来重试这些连接和读取超时。我的重试模板的代码如下。我的代码有问题,无法弄清楚。任何见解都会非常有帮助。我在“回调”中遇到错误,它指出它无法自动装配并且没有找到任何 bean。对于“失败”,我得到一个无法解析的符号。

 @Bean
public RetryTemplate retryTemplate(RetryCallback<RetryTemplate, Exception> callback) {
    RetryTemplate template = new RetryTemplate();
    ExceptionClassifierRetryPolicy retryPolicy = new ExceptionClassifierRetryPolicy();
    Map<Class<? extends Throwable>, Boolean> retryableExceptions = new HashMap<Class<? extends Throwable>, Boolean>();
    retryableExceptions.put(SocketTimeoutException.class, Boolean.TRUE);
    retryableExceptions.put(ConnectionPoolTimeoutException.class, Boolean.TRUE);
    retryableExceptions.put(ResourceAccessException.class, Boolean.TRUE);

    NeverRetryPolicy doNotRetry = new NeverRetryPolicy();
    SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy(maxAttempts, retryableExceptions);
    simpleRetryPolicy.setMaxAttempts(maxAttempts);


    FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
    backOffPolicy.setBackOffPeriod(backOffPeriod);

    template.setRetryPolicy(simpleRetryPolicy);
    template.setBackOffPolicy(backOffPolicy);

    try {
        return template.execute(callback);
    } catch (Exception e) {
        logger.error("Retry processing failed " + e.getMessage());
        return RetryTemplate.FAILED;
    }
}

标签: javaspringconnection-timeoutspring-retrysocket-timeout-exception

解决方案


@Bean工厂方法只是一个 bean 定义;你不能像这样放置运行时代码

try {
    return template.execute(callback);
} catch (Exception e) {
    logger.error("Retry processing failed " + e.getMessage());
    return RetryTemplate.FAILED;
}

那里。你必须return template;

由于您将 a 传递RetryCallback到工厂方法中,因此您必须在@Bean其他地方定义了该类型的 a 。

但是,回调是在运行时使用的,而不是在 bean 定义时使用的。

然后template.execute(),您可以在应用程序的其他地方使用。

究竟是什么RetryTemplate.FAILED——没有这样的常数。


推荐阅读