Aliyun OSS Java SDK发送一个请求,有5个阶段:
阶段Ⅰ
- 从连接池中获取连接,如果使用的连接已经达到最大连接数,则等待直到有连接释放,或达到最大超时时间,抛出异常ConnectionPoolTimeoutException。如果设置了比较大最大连接数,但是并不想让连接池中真正占用很多连接,SDK会自动关闭闲置时间较长的连接。
- 最大连接数默认1024个,使用
ClientConfiguration.setMaxConnections
设置。
从连接池中获取默认不超时,可以通过ClientConfiguration.setConnectionRequestTimeout
设置。默认SDK会关闭闲置超过60秒的连接,可以通过ClientConfiguration.setIdleConnectionTime
设置。 - OSS Java SDK使用连接池,是为了复用连接,减少发送请求时重复建立连接、断开连接的时间,提高服务效率、增强服务器稳定性。
阶段Ⅱ
- 从连接池中获取的连接,如果尚未建立到OSS连接,则新建。新建连接有超时时间,超时报ConnectionTimeout。如果从连接池中获取的连接已经建立,检查连接闲置时长。如果连接闲置时长没有超过阈值,直接复用连接;如果超过阈值,检测连接有效性,有效继续使用,无效重建连接。
- 新建连接默认超时时间50秒,可以通过
ClientConfiguration.setConnectionTimeout
设置。 - 默认连接闲置时长超过2秒,复用前检查连接是否有效。 闲置连接使用前有效性检查功能在2.1.2前的版本有bug,2.1.2及其后版本修改,原因及问题详见[常见问题]。
阶段Ⅲ
发送请求。请求发送的速度受网络速度的影响。发送请求的超时基于TCP协议栈的超时重传机制,一般不需要设置超时时间,目前也没有提供方法设置。
- LINUX内核的TCP协议栈重传超时一般是15到30分钟。
阶段Ⅳ
- 请求发送成功后,等待回复。等待回复是有超时时间的,超时会抛出异常SocketTimeout。等待数据回复超时时间默认50秒,可以通过
ClientConfiguration. setSocketTimeout
。 - 该参数请根据实际网络情况设置。
阶段Ⅴ
- 接收数据。如果数据较大,会分多个包传输,收到第N个包后,超时时间内未收到第N+1包在,也会抛出异常SocketTimeout。
包间隔超时时间与等待数据回复超时时间由参数ClientConfiguration.setSocketTimeout
控制 。 - 该参数请根据实际网络情况设置。
一些应用场景下用户需要控制整个请求的时间,即上面5个阶段的时间总和。如视频直播场景下,上传一个请求是有时效性限制的。OSS Java SDK提供了请求级别的时间设置:
// 需要开启,默认不开启
ClientConfiguration.setRequestTimeoutEnabled(true);
// 设置请求超时,单位毫秒,默认值300秒
ClientConfiguration.setRequestTimeout(300 * 1000);
如果请求超过了设置时间尚未完成,请求失败,抛出异常ClientException。
提示
- OSS Java SDK超时单位都是毫秒。