httpClient

1.httpClient要设置3个超时时间

1.connectionRequestTimeout ,httpClient使用连接池管理连接,这个时间指从连接池获取连接的超时时间。

2.connectionTimeout,指的是连接建立时间,即三次握手完成时间

3.socketTimeout,指的是数据传输过程中数据包之间间隔的最大时间(可以理解为接收服务器的响应时间)

httpClient_第1张图片

httpGet,httpPost也可以设置上面的三个属性,设置了后,则httpClient设置的此三个属性不生效。

httpClient还可以设置defaultMaxPerRoute,maxTotal

defaultMaxPerRoute: 连接池中每个路由(IP:端口)默认的最大连接数(初始值5)

maxTotal:连接池中最大的连接数(初始值10)

根据request请求头中Connection:keep-alive属性设置connection的复用性,

根据 response返回的keep-alive timeout来设置过期时长

设置keep-alive timeout造成的问题:NoHttpResponseException

如果服务端关闭连接,发送FIN包,在这个FIN包发送但是还未到达客户端期间,客户端如果继续复用这个TCP连接发送HTTP请求报文的话,服务端会因为在四次挥手期间不接收报文而发送RST报文给客户端,客户端收到RST报文就会提示NoHttpResponseException

解决方法:

1.重试

2.设置一个定时线程,定时清理上述闲置连接,定时时间设置为keep alive timeout的一半以保证超时前回收

2.ClientExecChain的执行流程

BackoffStrageyExec -->RedirectExec -->ServiceUnavailableRetryExec-->RetryExec

-->ProtocolExec -->MainClientExec

3.HttpClientContext的理解

httpClientContext可以设置CookieStore,在http请求时带上httpClientContext,返回时可以从cookieStore中获取到cookie

下次请求再带上这个httpClientContext,则会自动带上之前的cookie信息

4.HttpResponseInterceptor

它的实现类ResponseProcessCookies会解析response中header中的set-cookie

httpClient_第2张图片

5.HttpRequestInterceptor

它的实现类RequestAddCookies,在http请求时添加cookie信息

httpClient_第3张图片

6.ProtocolExec

在执行execute(route,request,context,execAware)前后进行httpRequestInterceptor,httpResponseInterceptor

其中httpProcessor是ImmutableHttpProcessor,里面既有httpRequestInterceptor也有httpResponseInterceptor

httpClient_第4张图片

7.RetryExec的理解

1.RetryExec在执行http请求的时候使用的是底层的基础代码MainClientExec,并记录了发送次数

2.当发出IOException的时候,判断是否要重试

1)首先是根据重试策略DefaultHttpRequestRetryHandler判断,如果可以重试就继续

2)如果重试策略判断不可以,就抛出相应异常并退出

3.默认的重试策略

1)如果重试超过3次,则不再重试

2)几种特殊异常及其子类,不进行重试

3)同一个请求在异步任务中已经被终止,则不进行重试

4)幕等的方法可以进行重试,如get head options

5) 如果请求没有发送成功,则可以进行重试

httpClient_第5张图片

httpClient_第6张图片

你可能感兴趣的:(java)