我看到一些奇怪的行为,看起来连接没有被正确重用。运行下面的代码导致TIMED_WAIT状态(app.config
)中有许多打开的连接,这使我认为连接没有被正确地重用或关闭。我没有在Retrofit文档中看到任何说明/不需要关闭的内容,但netstat -an | grep TIMED_WAIT
或Call
都不是Response
。我可以使用同步Closeable
(下方)或异步execute()
重现问题。
我已尝试使用连接池enqueue(Callback)
以及所使用的maxIdleConnections
,但我没有看到任何改进。
使用Retrofit v2.3.0和OkHttpClient v3.9.1
任何指针都表示赞赏。
Dispatcher
接口
public class Main {
public static void main(String[] args) throws IOException {
final Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(10);
dispatcher.setMaxRequestsPerHost(10);
OkHttpClient client = new OkHttpClient.Builder()
.dispatcher(dispatcher)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://10.200.110.201:8084/prometheus-ws/")
.client(client)
.addConverterFactory(ScalarsConverterFactory.create())
.build();
final SomeApi api = retrofit.create(SomeApi.class);
for (int i = 0; i < 10000; i++) {
final Response<String> resp = api.getStatus().execute();
System.out.println(resp.body());
}
}
}
编辑:看起来这是一个主要因素,即服务器正在发送public interface SomeApi {
@GET("rest/status")
Call<String> getStatus();
}
标头(低Connection: close
值)。我可以在我的情况下更改这一点 - 虽然我仍然很奇怪,这会对客户端造成太大影响,或者当它看到maxKeepAlive
标头时,这些客户端连接没有立即正确关闭。这是Retrofit / OkHttp中的错误吗?