2017-08-24 12 views
0

私のプロジェクトでは、特定のリモートサーバーAが別のアプリケーションBから呼び出されます。アプリケーションBはXノードに分散されています。アプリケーションBには、PoolingHttpClientConnectionManagerとHttpClientが作成される場所が1つあります。しかし、HttpClient.execute()メソッドは、アプリケーションBのコードベース上にあります。apache HttpClientを呼び出す

遠隔測定目的のために、各XノードがリモートサーバーAに行った呼び出しの並行回数を追跡します。呼び出しを追跡するためにカウンタをインクリメントおよびデクリメントするクライアントをStatsDします。アイデアは、コールの開始時にカウンタをインクリメントし、コールが成功したときにカウンタをインクリメントし、失敗したりタイムアウトしたりすることです。

私の最初の考えは、HttpRequestInterceptorとHttpResponseInterceptorを使用してカウンタを増減することです。ただし、タイムアウトの場合は応答がないため、HttpResponseInterceptorは呼び出されません。

この問題の回避策はありますか?それとも良い解決策がありますか?私はHttpClient.execute()を行うメソッドに注釈を付けることができれば問題は簡単だと知っていますが、コードベースのサイズを考えると高価なソリューションです。したがって、私はより良い選択肢を探しています。前もって感謝します。

答えて

2

プロトコルインターセプタの代わりにカスタム要求実行インターセプターを使用してみてください

final AtomicLong concurrentExchangeCount = new AtomicLong(0); 

final HttpClientBuilder httpClientBuilder = new HttpClientBuilder() { 

    @Override 
    protected ClientExecChain decorateMainExec(final ClientExecChain mainExec) { 
     return (route, request, clientContext, execAware) -> { 
      concurrentExchangeCount.incrementAndGet(); 
      try { 
       return mainExec.execute(route, request, clientContext, execAware); 
      } finally { 
       concurrentExchangeCount.decrementAndGet(); 
      } 
     }; 
    } 
}; 
final CloseableHttpClient httpClient = httpClientBuilder.build(); 
関連する問題