multithreadinghttpClient

public class test { public static final int nThreads = 2; public static void main(String[] args) throws ExecutionException, InterruptedException{ // Runnable myrunnable = new myRunnable(); ExecutorService execute = Executors.newFixedThreadPool(nThreads); for (int i = 0; i = maxCalls) { break; } try { Thread.currentThread().sleep(sleepMillis); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } execHttpRequest(); ++counter; } } private void execHttpRequest() { httpclient = new DefaultHttpClient(); HttpGet httpget = new HttpGet("My URL"); try { response = httpclient.execute(httpget); BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String output; while((output=br.readLine())!=null){ System.out.println(Thread.currentThread().getName() +output); } br.close(); httpclient.getConnectionManager().shutdown(); //httpclient.getConnectionManager().shutdown(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally{ httpclient.getConnectionManager().shutdown(); } } } 

运行此代码时,我得到以下exception:

 Exception in thread "pool-1-thread-1" java.lang.IllegalStateException: Invalid use of SingleClientConnManager: connection still allocated. Make sure to release the connection before allocating another one. at org.apache.http.impl.conn.SingleClientConnManager.getConnection(SingleClientConnManager.java:216) at org.apache.http.impl.conn.SingleClientConnManager$1.getConnection(SingleClientConnManager.java:190) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:401) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732) at MyTask.execHttpRequest(test.java:72) at MyTask.run(test.java:60) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722) java.io.InterruptedIOException: Connection has been shut down at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:543) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732) at MyTask.execHttpRequest(test.java:72) at MyTask.run(test.java:60) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722) Caused by: org.apache.http.impl.conn.ConnectionShutdownException at org.apache.http.impl.conn.AbstractPooledConnAdapter.assertValid(AbstractPooledConnAdapter.java:86) at org.apache.http.impl.conn.AbstractPooledConnAdapter.getRoute(AbstractPooledConnAdapter.java:112) at org.apache.http.impl.client.DefaultRequestDirector.establishRoute(DefaultRequestDirector.java:740) at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:577) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425) ... 8 more 

当我执行http请求时,我会看到这些exception。 它适用于单线程。 我试图调用一个特定的URL(它工作得很好)但是当我向它添加多个线程时,它会抛出一个非法的状态exception。

您需要定义multithreadingHttpConnectionManager,例如

 MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager(); HttpClient client = new HttpClient(connectionManager); 

有关更多详细信息,请参阅http://hc.apache.org/httpclient-3.x/threading.html

来到这里说,MultiThreadedHttpConnectionManager已经过时了。 目前(HttpClient版本4. *)这是这样的: http : //hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d5e639

 SchemeRegistry schemeRegistry = new SchemeRegistry(); schemeRegistry.register( new Scheme("http", 80, PlainSocketFactory.getSocketFactory())); ClientConnectionManager cm = new PoolingClientConnectionManager(schemeRegistry); HttpClient httpClient = new DefaultHttpClient(cm); 

我意识到自己的愚蠢! httpClient和httpRequest都是静态的。 在我使它们非静态之后它工作正常! Executor Service让我更好地控制线程管理,我热衷于使用它。

除了bpgergo答案之外 – 连接管理器已经再次更新(从HttpClient版本> = 4.3),现在你应该使用PoolingHttpClientConnectionManagerPoolingHttpClientConnectionManager的默认限制是总共20个连接,每个路由2个 – 但可以覆盖这些连接。

 PoolingHttpClientConnectionManager cm=new PoolingHttpClientConnectionManager(); cm.setDefaultMaxPerRoute(40); cm.setMaxTotal(500); CloseableHttpClient client = HttpClients.createMinimal(cm);