【问题标题】:Calling execution.execute() twice in RestTemplate interceptor在 RestTemplate 拦截器中调用 execution.execute() 两次
【发布时间】:2018-01-06 19:26:57
【问题描述】:

我必须与需要随每个请求一起发送访问令牌的外部服务集成。访问令牌的过期时间很短(只有几个小时)。我决定以乐观的方式使用访问令牌。我将使用当前令牌调用外部服务。如果遇到 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() 两次?我没有找到任何禁止它的信息,但另一方面我也没有看到这样的代码。

【问题讨论】:

  • 我也有同样的需求,我想使用类似于您建议的拦截器。此解决方案是否有效或您是否遇到过问题?我找不到任何关于如何提议代币协商的信息

标签: java spring interceptor resttemplate retry-logic


【解决方案1】:

我们正在做同样的事情 - 并且遇到了问题。由于原始响应被忽略且未正确关闭,因此您拥有的这段代码将泄漏连接。我目前的解决方案是显式关闭它,然后执行第二次。到目前为止似乎有效,但我想它需要更多评估。

【讨论】:

  • 如何关闭它?
猜你喜欢
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 2015-11-18
  • 2018-12-24
  • 1970-01-01
相关资源
最近更新 更多