Retrofit2不重用连接 - 许多TIMED_WAIT连接

时间:2018-01-23 17:41:28

标签: java retrofit2

我看到一些奇怪的行为,看起来连接没有被正确重用。运行下面的代码导致TIMED_WAIT状态(app.config)中有许多打开的连接,这使我认为连接没有被正确地重用或关闭。我没有在Retrofit文档中看到任何说明/不需要关闭的内容,但netstat -an | grep TIMED_WAITCall都不是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中的错误吗?

0 个答案:

没有答案