我需要编写一个代码来发送服务器请求,请求是xml格式的字符串。在做研究之后,我选择使用多个线程和连接池管理器来处理请求和响应。我使用PoolingHttpClientConnectionManager,httpclient 4.3版本。当我使用一个线程时,代码工作,发送请求并获得响应。但是当我把它作为多个线程并使用单个httpclient时,连接似乎被打破了。我使用netstat检查并查看TCP状态是TIME_WAIT。我的代码就像:
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(50);
cm.setDefaultMaxPerRoute(10);
cm.setMaxPerRoute(new HttpRoute(new HttpHost(ENV_ ABCD)), 20);
CloseableHttpClient httpclient = HttpCleints.custom().setConnectionManager(cm).build();
我也使用线程池,每个线程用于处理一个任务(runnable)。该任务包括生成一个请求,将请求发送到服务器以及获取和处理响应,一旦此任务完成,该线程就会被放回线程池,并且连接也会被放回连接池。
到目前为止,所有请求都被发送到同一服务器。
可运行任务包括以下行代码:
HttpPost post = new HttpPost(url);
try {
// the request is xml string
post.setEntity(new StringEntity(request));
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
String responseStr = null;
try {
// the commonHttpClient is same instance of httpclient declared above.
HttpResponse response = commonHttpClient.execute(post);
HttpEntity entity = response.getEntity();
if (entity != null){
responseStr = getString(entity.getContent());
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
我没有得到任何回应。我可以看到代码挂在“commonHttpClient.execute(post);”的行上。从netstat,它告诉客户端关闭连接。
如果只有一个线程,我没有这个问题。任何人都可以告诉我我的代码的哪一部分是错的。我是否会错过任何配置连接的步骤?使用apache httpclient 4.3很难找到这个例子。
由于