使用spring-cloud-starter-openfeign时如何在500错误时重置OkHttp3连接池连接
实现方案
方案1:直接关闭当前连接(推荐,效果明确)
OkHttp3 中Interceptor.Chain获取到的Connection接口本身提供close()方法,调用后会直接销毁当前连接,不会放回连接池,符合你的需求。
修改你的拦截器代码如下:
@Bean public OkHttpClient client() { return new OkHttpClient( new okhttp3.OkHttpClient.Builder() .addNetworkInterceptor(new ResetConnectionInterceptor()) .build()); } public static class ResetConnectionInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { okhttp3.Request request = chain.request(); Response response = chain.proceed(request); if (response.code() >= 500 && response.code() < 600) { // 关闭当前连接,该连接会被直接销毁,不会放回连接池 chain.connection().close(); } return response; } }
方案2:添加Connection关闭头(兼容更通用的HTTP逻辑)
如果不想直接操作连接对象,也可以给响应头添加Connection: close标识,OkHttp识别到该标识后会自动关闭当前连接:
if (response.code() >= 500 && response.code() < 600) { return response.newBuilder() .header("Connection", "close") .build(); }
注意事项
- 两种方案都适用于你当前使用的OkHttp3 3.x版本(对应spring-cloud-starter-openfeign 2.1.0的依赖版本),功能效果一致
- 直接关闭连接不会影响本次响应的返回,仅会阻止当前连接被后续请求复用
- 不需要重复关闭响应体,OkHttp会自动处理后续资源释放逻辑
内容的提问来源于stack exchange,提问作者developer-OK
相关产品推荐
相关产品推荐

