2016-01-21 40 views
1

爲了模擬一個有很多用戶的web應用程序,我使用了一個for循環,我知道它仍然非常不同,因爲這將是單線程和所有這些。我的代碼如下很多請求的httpclient超時

public CloseableHttpClient getHttpClient() { 
     try{ 
      SSLContext context = null; 
      TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
       public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
        return null; 
       } 

       public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { 
       } 

       public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { 
       } 
      } }; 

      try { 
       context = SSLContext.getInstance("SSL"); 
      } catch (NoSuchAlgorithmException e1) { 
       e1.printStackTrace(); 
      } 
      try { 
       context.init(null, trustAllCerts, new java.security.SecureRandom()); 
      } catch (KeyManagementException e1) { 
       e1.printStackTrace(); 
      } 

      SSLConnectionSocketFactory sslConnectionFactory = new SSLConnectionSocketFactory(context, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 
      Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create() 
         .register("https", sslConnectionFactory) 
         .register("http", new PlainConnectionSocketFactory()).build(); 

      PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry); 
      // Increase max total connection to 200 
      cm.setMaxTotal(20); 
      // Increase default max connection per route to 20 
      cm.setDefaultMaxPerRoute(10); 
      RequestConfig defaultRequestConfig = RequestConfig.custom() 
         .setSocketTimeout(5000) 
         .setConnectTimeout(5000) 
         .setConnectionRequestTimeout(5000) 
         .build(); 
      CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).setConnectionManagerShared(true) 
        .setDefaultRequestConfig(defaultRequestConfig).build(); 
      return httpClient; 
     }catch(Exception ce){ 

     } 
     return null; 
    } 

然後在循環我使用它就像下面

try{ 
for(int i=0;i<500;i++){ 
       client = getHttpClient(); 
request = new HttpPost("Some https URL"); 
       HttpResponse response = client.execute(request); 
       int statusCode = response.getStatusLine().getStatusCode(); 
if (statusCode == 200){ 
        entity = response.getEntity(); 
        String content = EntityUtils.toString(entity); 
} 
       else{ 
        entity = response.getEntity(); 
        String content = EntityUtils.toString(entity); 
}} 
catch(Exception ce){} 
finally{ 
        try { 
         EntityUtils.consume(entity); 
         request.releaseConnection(); 
         client.close(); 
         } catch (IOException e) { 
        } 
       } 

我得到了一些請求響應,而失敗的幾個具有讀超時,如果我增加最大連接我得到幾個失敗如果我仍然在連接管理器中將最大連接數保持爲200,我仍然失敗,但沒有使用該配置那麼多,我缺少了什麼。下面異常

java.net.SocketTimeoutException:閱讀java.net.SocketInputStream.socketRead0(本機方法) 超時 在java.net.SocketInputStream.read(SocketInputStream.java:152) 是java。 net.SocketInputStream.read(SocketInputStream.java:122) at sun.security.ssl.InputRecord.readFully(InputRecord.java:442) at sun.security.ssl.InputRecord.read(InputRecord.java:480) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:946) at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:903) at sun.security.ssl.AppInputStream.re廣告(AppInputStream.java:102) at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:139) at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java: 155) 在org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:284) 在org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:140) 在有機apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57) at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:261) at org.apache.http.impl。 DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:165) at org.apache.http .impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:167) 在org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:272) 在org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor .java:124) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:271) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) at org.apache.http .impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java :82) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107) at com.ibm.indo.serviceImpl.GenericServiceImpl.checkDomRegNew(GenericServiceImpl.java:233) at com.ibm .indo.controller.ReportsController.checkDomRegNew(ReportsController.java:45) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在sun.reflect。 DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) at org。springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 在org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 在org.springframework。 web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) 在org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) 的組織。 springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) at org.springframework.web.servlet。 DispatcherServ let.doService(DispatcherServlet.java:893) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869)在javax.servlet.http.HttpServlet.service(HttpServlet.java:754) (位於org.springframework.web.servlet.FrameworkServlet.service HttpServlet.java:847) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) 的組織。 apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) at org.apache.catalina。核心。標準主機版本.invoke(StandardHostValve.java:155) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: 109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) at org.apache.coyote。 http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:671) at org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:930) 在java.lang.Thread.run(Thread.java:745)

+0

嘗試設置在請求鎖。我沒有看到代碼爲 –

回答

2

您確定您的HTTPS服務器能否順利處理200個連接? 我覺得,問題不在於你的httpsClient Code。服務器可能因爲負載而拒絕接受少量請求?

1

作爲異常下面很明顯,httpclient是無法進行套接字連接。 httpclient嘗試建立連接,但在連接建立的預定義時間內連接失敗。

java.net.SocketTimeoutException: Read timed out at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:152) at java.net.SocketInputStream.read(SocketInputStream.java:122) at 

請檢查該

與Apache HttpClient的,why isn't my connection timeout working?

http://brian.olore.net/wp/2009/08/apache-httpclient-timeout/

+0

的資源(http客戶端)上的任何鎖定問題可能通過增加連接超時或使用最大連接來處理請求來解決。 –