在RestTemplate拦截器中调用execution.execute()两次

时间:2017-07-31 09:36:01

标签: java spring interceptor resttemplate retry-logic

我必须与需要访问令牌的外部服务集成,以便与每个请求一起发送。访问令牌的到期时间很短(只有几个小时)。我决定以乐观的方式使用访问令牌。我将使用当前令牌调用外部服务。我获得401的情况我将刷新令牌并再次调用外部API。

我决定使用ClientHttpRequestInterceptor来实现所描述的重试机制。

public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
   ClientHttpResponse response = execution.execute(request, body);
   if(response.getStatusCode() == UNAUTHORIZED) {
       refreshToken();
       updateToken(request);
       response = execution.execute(request, body);
   }
   return response;
}

我测试了它并且它可以工作,但允许两次调用execution.execute()吗?我没有找到任何被禁止的信息,但另一方面我还没有看到这样的代码。

1 个答案:

答案 0 :(得分:4)

我们做的完全一样 - 并且遇到了问题。您在那里的这段代码将泄漏连接,因为原始响应被忽略而未正确关闭。我目前的解决方案是明确关闭它,然后执行第二次执行。似乎到目前为止工作,但我想它需要更多的评估。