【发布时间】:2018-03-29 22:57:17
【问题描述】:
为了模拟一个有很多用户的 web 应用程序,我使用了一个 for 循环,我知道它仍然非常不同,因为这将是单线程等等。我的代码如下
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) {
}
}
我得到了少数请求的响应,而少数请求因读取超时而失败,如果我增加最大连接,我很少失败如果我在连接管理器中保持 max conn 为 200,我仍然很少失败,但没有这个配置那么多,我错过了什么。以下例外
java.net.SocketTimeoutException: 读取超时 在 java.net.SocketInputStream.socketRead0(本机方法) 在 java.net.SocketInputStream.read(SocketInputStream.java:152) 在 java.net.SocketInputStream.read(SocketInputStream.java:122) 在 sun.security.ssl.InputRecord.readFully(InputRecord.java:442) 在 sun.security.ssl.InputRecord.read(InputRecord.java:480) 在 sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:946) 在 sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:903) 在 sun.security.ssl.AppInputStream.read(AppInputStream.java:102) 在 org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:139) 在 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) 在 org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57) 在 org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:261) 在 org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:165) 在 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) 在 org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:271) 在 org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) 在 org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88) 在 org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) 在 org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) 在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) 在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107) 在 com.ibm.indo.serviceImpl.GenericServiceImpl.checkDomRegNew(GenericServiceImpl.java:233) 在 com.ibm.indo.controller.ReportsController.checkDomRegNew(ReportsController.java:45) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 在 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) 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) 在 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:754) 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) 在 org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) 在 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) 在 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) 在 org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) 在 java.lang.Thread.run(Thread.java:745)
【问题讨论】:
-
尝试对请求设置锁定。我在您的代码中没有看到任何资源(http 客户端)锁定
标签: java apache jakarta-ee httpclient apache-httpclient-4.x