2011-11-10 9 views

答えて

0

ええ、それはApache Clientについての私のバグです。単純なものだけが必要な場合は、URLとopenConnection()を使用することができます。

+0

私は単純なものは必要ありませんが、私は良いパフォーマンスと安定性を提供するものが必要です:-)。 –

+1

HTTPClientをスレッドセーフな方法で使用できるようです: https://hc.apache.org/httpclient-3.x/threading.html – JohnnyK

2

HTTPクライアントのThreadSafeClientConnManagerを使用する必要があります。スレッド間でHttpClientという1つのインスタンスを再利用できるようになります。詳細については、thisガイドを参照してください。ここで

1

は(ApacheのHTTPClientのに基づいて)あなたが欲しいものを実装して、簡単な例である:

public class ApacheHttpTransportImpl extends BaseHttpTransport { 
    private final CloseableHttpClient threadSafeClient; 
    private final IdleConnectionMonitorThread monitor; 
    public ApacheHttpTransportImpl() throws NoSuchAlgorithmException, KeyManagementException { 
     super(config); 
     ConnectionSocketFactory socketFactory = new PlainConnectionSocketFactory(); 
     Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", socketFactory).build(); 
     PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry); 
     cm.setMaxTotal(256); 
     cm.setDefaultMaxPerRoute(64); 
     RequestConfig clientConfig = RequestConfig.custom().setConnectTimeout(2000) 
.setSocketTimeout(1000).setConnectionRequestTimeout(2000).build(); 
     threadSafeClient = HttpClients.custom().setDefaultRequestConfig(clientConfig).setConnectionManager(cm).build(); 
     monitor = new IdleConnectionMonitorThread(cm, this); 
     monitor.setDaemon(true); 
     monitor.start(); 
    } 
    public CloseableHttpClient get() { 
     return threadSafeClient; 
    } 

    private static class IdleConnectionMonitorThread extends Thread { 
     private final PoolingHttpClientConnectionManager cm; 
     private final BlockingQueue<Stop> stopSignal = new ArrayBlockingQueue<Stop>(1); 
     private final ApacheHttpTransportImpl cp; 
     private static class Stop { 
      private final BlockingQueue<Stop> stop = new ArrayBlockingQueue<Stop>(1); 
      public void stopped() { 
       stop.add(this); 
      } 
      public void waitForStopped() throws InterruptedException { 
       stop.take(); 
      } 
     } 
     IdleConnectionMonitorThread(PoolingHttpClientConnectionManager cm, ApacheHttpTransportImpl cp) { 
      super(); 
      this.cm = cm; 
      this.cp = cp; 
     } 
     @Override 
     public void run() { 
      try { 
       Stop stopRequest; 
       while ((stopRequest = stopSignal.poll(5, TimeUnit.SECONDS)) == null) { 
        cm.closeExpiredConnections(); 
        cm.closeIdleConnections(60, TimeUnit.SECONDS); 
       } 
       stopRequest.stopped(); 
      } catch (InterruptedException e) { 
      } 
     }  
    } 
} 

そして、ここではそれがどのように使用できるかです:

また
ApacheHttpTransportImpl transport = new ApacheHttpTransportImpl(); 
HttpGet httpGet = new HttpGet("http://www.google.com"); 
CloseableHttpResponse httpResponse = transpot.get().execute(httpGet); 

、あなたが取ることができますUnirestを見てください - それはApacheのhttpclientにも基づいていますが、使い方は非常に簡単です。

関連する問題