OkHttp3 超时设置

OkHttp3 超时设置,第1张

目录

1,AsyncTimeout

2-1,耗时段介绍「从上往下」

2-2,4个超时设置「OkHttpClient.Builder」

2-3,耗时 *** 作之间的关联

0,参考

okhttp Timeout 超时设置与用法解释: https://www.jianshu.com/p/7547a5e8524a

1,AsyncTimeout

AsyncTimeout.enter 案例

1,首次创建 Watchdog + AsyncTimeout作为static量,避免重复创建

2,单线程,设置超时,通过pine/pip机制,若超时通过写入流方式唤醒

2-1,耗时段介绍「从上往下」

耗时 *** 作调用位置

DNS解析 「ConnectInterceptor」streamAllocation.newStream

「RouteSelector」address.dns().lookup()

连接时间「ConnectInterceptor」streamAllocation.newStream

「Platform」socket.connect()

写入request 「CallServerInterceptor」httpCodec.writeRequestHeaders

服务器响应 「ConnectInterceptor」streamAllocation.newStream

「RealConnection」socket.connect()

读取response 「CallServerInterceptor」httpCodec.readResponseHeaders

2-2,4个超时设置「OkHttpClient.Builder」

api 简介 生效机制

callTimeout() 整个流程耗费的超时时间 RealCall.execute方法,设置进入

AsyncTimeout + WatchDog实现

connectTimeout()三次握手 + SSL建立耗时 socket.connect(address, connectTimeout)

readTimeout() source读取耗时 source.timeout(readTimeout)

AsyncTimeout + WatchDog实现

rawSocket读取耗时 rawSocket.setSoTimeout(readTimeout)

writeTimeout() sink写入耗时sink.timeout(writeTimeout)

AsyncTimeout + WatchDog实现

重点说一下,callTimeout这个参数,网络上很少人使用。这个就是整个网络流程的超时设置。

2-3,耗时 *** 作之间的关联

route.requiresTunnel() callTimeout = dns + connection + readTimeout + readTimeout + writeTimeout + 其它

无 callTimeout = dns + connectTime + readTimeout + 其它

1,基本耗时:dns + 三次握手耗时 + 服务器响应耗时

2,若有渠道,则增加 source.timeout().(readTimeout) + sink.timeout.(writeTimeout)

方法一:web app server中,如websphere里可以设置超时时间为30分钟。

方法二:在web.xml中的session-config配置

session-timeout元素(WEB.XML文件中的元素)用来指定默认的会话超时时间间隔,以分钟为单位。该元素值必须为整数。如果 session-timeout元素的值为零或负数,则表示会话将永远不会超时。如:

<session-config> <session-timeout>30</session-timeout></session-config>//30分钟

方法三:setMaxInactiveInterval设置当前会话时间

setMaxInactiveInterval设置的是当前会话的失效时间,不是整个web的时间,单位为以秒计算。如果设置的值为零或负数,则表示会话将永远不会超时。常用于设置当前会话时间。该优先级要比方法三中的优先级高。

方法四:session中保存一个bean或者map,里面存储上相应的过期时间,一旦过期,remove掉。

方法四可以通过一个线程去扫描,如果时间带了,线程自动清除,或者用的时候进行判断,用过后进行remove,如果使用线程自动remove,可以使用spring的线程池。

第一,ConnectionPoolTimeout:

定义了从ConnectionManager管理的连接池中取出连接的超时时间。

出错会抛出ConnectionPoolTimeoutException

第二,ConnectionTimeout:

定义了通过网络与服务器建立连接的超时时间,Httpclient包中通过一个异步线程去创建与服务器的socket连接,这就是该socket连接的超时时间。

当连接HTTP服务器或者等待HttpConnectionManager管理的一个有效连接超时出错会抛出ConnectionTimeoutException

第三,SocketTimeout:

这定义了Socket读数据的超时时间,即从服务器获取响应数据需要等待的时间。

当读取或者接收Socket超时会抛出SocketTimeoutException


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7796786.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存