jps -lvm
jstack -l pid
requestConfig 設置timeout不生效
job出現卡死杜塞情況,查看線程如下
"dcpUpdateOtrAccessTokenCronJob::de.hybris.platform.servicelayer.internal.jalo.ServicelayerJob" prio=5 tid=0x54068 nid=0xd334 RUNNABLE (JNI Native Code) - stats: cpu=344392 blk=-1 wait=-1
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
at sun.security.ssl.InputRecord.read(InputRecord.java:503)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975)
原因:高並發,cpu線程切換頻繁,時候會出現SocketInputStream.socketRead0問題
解決方案:
設置httpclien的請求超時時間
代碼如下
requestConfig = RequestConfig.custom().setConnectTimeout(CONNECT_TIME_OUT).setConnectionRequestTimeout(CONNECT_TIME_OUT)
.setSocketTimeout(CONNECT_TIME_OUT).setProxy(proxy).build();
這是超時時間之后,發現設置的timeout並不起作用(疑似沒有生效),懷疑有重試機制(查資料發現defaultRetryHandle會重試三次),設置retryHandle
private HttpRequestRetryHandler otrRetryHandler = new HttpRequestRetryHandler() {
@Override
public boolean retryRequest(IOException exception,
int executionCount, HttpContext context) {
return false;
}};
CloseableHttpClient httpClient = HttpClients.custom().setRetryHandler(otrRetryHandler).build();(測試沒效果,連第三方系統還是掛掉了)
可以設置最大連接數
CloseableHttpClient httpClient = HttpClients.custom().setMaxConnPerRoute(3).setMaxConnTotal(3);
MaxConnPerRoute 分配給同一個route的最大連接數 route是server到目標服務器的一條線路 MaxConnTotal連接池最大連接數
譬如使用httpClient分別請求www.baidu.com 和 www.google.com獲取資源,就會產生兩個route
嘗試發現以上方法不可行,現象是獲取三方接口時,httpClient會卡死,異常如上,猜想第一次連接目標服務器就被掛起了,沒有拋出預想當中的timeout異常
最后,嘗試org.apache.commons.httpclient
httpClient也可以設置超時如下
httpClient.getParams().setConnectionManagerTimeout(60000);
httpClient.getParams().setSoTimeout(60000);
這種方式可以正常拋出預想當中的time out異常
INFO | jvm 1 | main | 2018/12/26 20:52:34.118 | java.net.SocketTimeoutException: Read timed out
INFO | jvm 1 | main | 2018/12/26 20:52:34.118 | at java.net.SocketInputStream.socketRead0(Native Method)
INFO | jvm 1 | main | 2018/12/26 20:52:34.118 | at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
INFO | jvm 1 | main | 2018/12/26 20:52:34.118 | at java.net.SocketInputStream.read(SocketInputStream.java:171)
INFO | jvm 1 | main | 2018/12/26 20:52:34.118 | at java.net.SocketInputStream.read(SocketInputStream.java:141)
INFO | jvm 1 | main | 2018/12/26 20:52:34.118 | at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
INFO | jvm 1 | main | 2018/12/26 20:52:34.118 | at sun.security.ssl.InputRecord.read(InputRecord.java:503)
INFO | jvm 1 | main | 2018/12/26 20:52:34.119 | at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
INFO | jvm 1 | main | 2018/12/26 20:52:34.119 | at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.jav
CloseableHttpClient不能拋出time out異常待驗證