0

マルチスレッドリクエストエラーをテストするためにapache-httpclientのhttpclientのテストサンプルを作成しています。HttpClient 4.5.xマルチスレッドリクエストエラー:このプールからリースされていません

私はforループで実行し、各ループに2つのスレッドを作成して、2つの異なるホスト設定をプーリングマネージャに設定してテストケースを実行します。

私はいつも1つのエラーに直面しました: スレッド "スレッド2"の例外java.lang.IllegalStateException:エントリ[ID:17] [ルート:{} - > http:// *** :8000] [状態:null]がこのプールからリースされていません org.apache.http.util.Asserts.check(Asserts.java:46)

私のコードに問題がありますか?私は何をすべきか?

サンプルは以下の通りです:

private void testHttpClient() { 

     HttpHost proxy = new HttpHost("dev.host.com", 8001); 
     final DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy); 

     final PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); 
     cm.setMaxTotal(20); 
     cm.setDefaultMaxPerRoute(1); 
     HttpHost localhost1 = new HttpHost("dev.test1.com", 8001); 
     cm.setMaxPerRoute(new HttpRoute(localhost1), 2); 
     HttpHost localhost2 = new HttpHost("dev.test2.com", 8000); 
     cm.setMaxPerRoute(new HttpRoute(localhost2), 2); 

     RequestConfig requestConfig = RequestConfig.custom() 
      .setConnectTimeout(1000) 
      .setSocketTimeout(1000) 
      .setConnectionRequestTimeout(1000) 
      .build(); 
     final CloseableHttpClient httpclient1 = HttpClients.custom() 
      .setConnectionManager(cm) 
      .setRoutePlanner(routePlanner) 
      .setDefaultRequestConfig(requestConfig) 
      .build(); 

     RequestConfig requestConfig2 = RequestConfig.custom() 
      .setConnectTimeout(1000) 
      .setSocketTimeout(1000) 
      .setConnectionRequestTimeout(1000) 
      .build(); 
     final CloseableHttpClient httpclient2 = HttpClients.custom() 
      .setConnectionManager(cm) 
      .setRoutePlanner(routePlanner) 
      .setDefaultRequestConfig(requestConfig2) 
      .build(); 

     class HttpClientThead1 implements Runnable { 
      public void run() { 
      for (int i = 1; i <= 1; i++) { 
       System.out.println("HttpClientThead1 Start"); 
       HttpClientContext context = HttpClientContext.create(); 
       try { 
       HttpGet httpget = new HttpGet("http://dev.test1.com:8001/test/id/10001"); 
       CloseableHttpResponse response = httpclient1.execute(httpget, context); 
       long t = System.currentTimeMillis(); 
       System.out.println("HttpClientThead1 " + i + ":" + response.getEntity().toString() + " " + t); 
       response.close(); 
       } catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       } finally { 
       cm.closeExpiredConnections(); 
       cm.closeIdleConnections(30, TimeUnit.SECONDS); 
       } 
      } 
      } 
     } 

    class HttpClientThead2 implements Runnable { 
     public void run() { 
     for (int i = 1; i <= 1; i++) { 
      System.out.println("HttpClientThead2 Start"); 
      HttpClientContext context = HttpClientContext.create(); 
      try { 
      HttpGet httpget2 = new HttpGet("http://dev.test2.com:8000/test/id/10002"); 
      CloseableHttpResponse response2 = httpclient2.execute(httpget2, context); 
      long t = System.currentTimeMillis(); 
      System.out.println("HttpClientThead2 " + i + ":" + response2.getEntity().toString() + " " + t); 
      response2.close(); 
      } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } finally { 
      cm.closeExpiredConnections(); 
      cm.closeIdleConnections(30, TimeUnit.SECONDS); 
      } 
     } 
     } 
    } 

    for (int j = 1; j <= 10; j++) { 
     HttpClientThead1 t1 = new HttpClientThead1(); 
     HttpClientThead2 t2 = new HttpClientThead2(); 

     Thread thread1 = new Thread(t1); 
     Thread thread2 = new Thread(t2); 
     thread1.start(); 
     thread2.start(); 
    } 
} 
+0

私はcm.setDefaultMaxPerRoute(10)を変更した場合、私はそれをチェックしています、私のホスト設定が機能していないようです。 それからOKです。どうして? –

答えて

0

私はこれにHTTPClientでプロキシを設定するので、私は、答えを得ました。 したがって、プロキシ情報を使ってsetMaxPerRouteにも設定する必要があります。

これは次のようになります。 cm.setMaxPerRoute(new HttpRoute(localhost2、proxy)、10);

関連する問題