我正在运行一个性能测试,使用Java “客户端” 访问Tomcat 8.5 Web服务器。大约在第13000个请求后,HTTP请求会失败,并出现以下错误:
org.apache.http.impl.client.DefaultHttpClient tryConnect
INFO: Retrying connect
java.net.BindException: Address already in use: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:127)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:643)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:479)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)
代码如下:
for (int i = 0; i < 15000; i++) {
try {
if (i % 1000 == 0) System.out.println("Iterations: " + Integer.toString(i));
HttpGet request = new HttpGet("http://localhost:9080");
DefaultHttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(request, new BasicHttpContext());
HttpEntity entity = response.getEntity();
EntityUtils.consume(entity);
} catch (Exception e) {
e.printStackTrace();
System.out.println("Iterations: " + Integer.toString(i));
System.exit(1);
}
}
如果我缓存DefaultHttpClient,则不会出现错误。也尝试过,
request.releaseConnection();
client.getConnectionManager().shutdown();
但是错误没有改变。 看起来错误不是由客户端引起的。如果我在URL中访问另一个网站,那么就可以了。似乎是由于运行在Windows上的Tomcat耗尽了文件句柄或套接字资源等造成的。 如果我在崩溃之后再次运行它作为另一个进程,它将在1次运行而不是13,000次失败,因此问题是Tomcat耗尽了资源。似乎DefaultHttpClient没有关闭它的连接,或者Tomcat在进行垃圾回收之前不释放它的连接。
使用HTTPClient 4.2.5
有任何想法为什么会发生这种情况,或者如何解决?
client.close()
或者将客户端放在 try-with-resources 语句块中吗?在我的代码中,我使用了CloseableHttpClient
和CloseableHttpResponse
接口,并且都是通过 try-with-resources 语句块关闭的。 - CoronA