OkHttpClient如何限制连接数?

20

OkHttpClient是否可以限制活动连接数?如果达到了限制,就不会选择和建立新的连接吗?

我的应用程序同时启动了很多连接。

2个回答

34
连接数可以在Dispatcher中配置,而不是仅允许配置最大空闲连接和保持活动功能的ConnectionPool中配置。
调度程序允许按主机配置连接数和最大连接数,默认值为每个主机5个连接和总共64个连接。如果使用HTTP/2,则这可能看起来很低,但对于HTTP/1来说还是可以的,因为多个请求可以发送到一个连接。
要配置调度程序,请按照以下步骤进行:
Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(100);
dispatcher.setMaxRequestsPerHost(10);
OkHttpClient client = new OkHttpClient.Builder()
    .dispatcher(dispatcher)
    .build();

3
“request”和“connection”不是不同的吗? - object
我认为设置最大请求数并不能让您在一个连接上利用HTTP/2并发流。 - szakal
我刚做了一个小测试,看起来这里的“request”确实不同于“connection”。在这里将请求的数量限制为1(例如),意味着我们将失去通过单个HTTP/2多路复用请求的能力,因为它会等待每个请求完成后才发送下一个请求。看起来没有办法限制实际连接的数量,但请随意纠正我。 - rboy
该流程确保调度程序实际上“像”连接池一样为您工作,因为它不允许系统在线程池已满时创建新的连接和调用。 - newhouse

-3
你可以通过在OkHttpClient.Builder上设置ConnectionPool来尝试配置最大空闲网络连接数。
int maxConnections = 5;
int keepAliveDuration = 15000;
ConnectionPool cp = new ConnectionPool(maxConnections, keepAliveDuration, TimeUnit.MILLISECONDS);

new OkHttpClient.Builder()
    .connectionPool(cp)
    .build();

7
第一个参数是maxIdleConnections。如果keepAlive过期,只有空闲连接才会被清除。如果达到了最大活动连接数,就没有办法阻止任何请求。 - Muthukannan Kanniappan
这还不够,这会限制池的数量,OP要求实时调用限制,这可以通过使用Dispatcher来实现。 - newhouse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接