如何从Rest模板实现SocketTimeoutException的Spring重试

时间:2019-05-07 07:23:57

标签: spring resttemplate socket-timeout-exception spring-retry connect-timeout

在其余模板出现“ SocketTimeoutException”的情况下,我想使用Spring重试功能。

但是Spring Rest模板像下面这样抛出: org.springframework.web.client.ResourceAccessException:I / O错误:读取超时。嵌套异常是java.net.SocketTimeoutException:读取超时

我在“重试模板映射”中添加了SocketTimeoutException。 仅当我在“重试模板映射”中添加SocketTimeoutException或也需要添加ResourceAccessException时,Spring重试才有效。

1 个答案:

答案 0 :(得分:1)

您需要使用设置了SimpleRetryPolicy选项的自定义traverseCauses。然后,它不仅检查顶级异常,还将检查原因层次结构以寻找匹配项。

/**
 * Create a {@link SimpleRetryPolicy} with the specified number of retry
 * attempts. If traverseCauses is true, the exception causes will be traversed until
 * a match is found.
 *
 * @param maxAttempts the maximum number of attempts
 * @param retryableExceptions the map of exceptions that are retryable based on the
 * map value (true/false).
 * @param traverseCauses is this clause traversable
 */
public SimpleRetryPolicy(int maxAttempts, Map<Class<? extends Throwable>, Boolean> retryableExceptions,
        boolean traverseCauses) {
    this(maxAttempts, retryableExceptions, traverseCauses, false);
}