2017-02-17 5 views
1

Ниже приведен код перехватчика для запроса и ответа на регистрацию при выполнении вызова Async Rest Call из Spring AsyncRestTemplate. Этот код работает, если мы можем использовать BufferingClientHttpResponseWrapper в другом пакете. Here - некоторые подробности о BufferingClientHttpResponseWrapper и как добавить его с помощью AsyncRestTemplate. Мой вопрос, когда я использую HttpComponentsAsyncClientHttpRequestFactory в моем AsyncRestTemplate. Как я могу получить Buffered Response. Мы НЕ МОЖЕМ использовать BufferingClientHttpResponseWrapper, как показано ниже в моем коде, поскольку это не открытый класс. Есть ли другой способ сделать это? Я знаю, что для HttpComponent AsyncHttpClient доступен проводной журнал. Но он будет иметь все журналы из всех AsyncResttemplates в целом приложении. Если мы хотим захватить журналы только для одного шаблона, то Interceptor - единственный способ, который я думаю. Пожалуйста, предложите, есть ли другой доступный вариант.Как использовать BufferingClientHttpResponseWrapper с HttpComponentsAsyncClientHttpRequestFactory

public class AsyncRestReqResInterceptor implements AsyncClientHttpRequestInterceptor { 
    private static final XLogger REQ_RES_LOGGER = XLoggerFactory.getXLogger("myLogger"); 

    @Override 
     public ListenableFuture<ClientHttpResponse> intercept(HttpRequest request, byte[] body, AsyncClientHttpRequestExecution execution) throws IOException { 
      String requestPath = request.getURI().getPath(); 
      REQ_RES_LOGGER.debug(request.getMethod()+" "+requestPath); 

      String requestBody = new String(body); 
      REQ_RES_LOGGER.debug(requestBody); 
      ListenableFuture<ClientHttpResponse> listenableFuture = execution.executeAsync(request, body); 
      ListenableFutureAdapter<ClientHttpResponse,ClientHttpResponse> futureAdapter= 
        new ListenableFutureAdapter<ClientHttpResponse, ClientHttpResponse>(listenableFuture) { 
         @Override 
         protected ClientHttpResponse adapt(ClientHttpResponse adapteeResult) throws ExecutionException { 
          return logResponseBody(adapteeResult); 
         } 
        }; 
      return futureAdapter; 
     } 

    private ClientHttpResponse logResponseBody(ClientHttpResponse response,boolean isImageInResponse){ 
       try { 
        BufferingClientHttpResponseWrapper responseWrapper = new BufferingClientHttpResponseWrapper(response); 
        REQ_RES_LOGGER.debug("Response Status Code :" + responseWrapper.getStatusCode().value()); 
        REQ_RES_LOGGER.debug("Response Status Text :" + responseWrapper.getStatusText()); 
        if (response != null && response.getBody() != null) { 
         String responseXml = IOUtils.toString(responseWrapper.getBody(), Charset.defaultCharset()); 
         REQ_RES_LOGGER.debug(responseXml); 
        } else { 
         REQ_RES_LOGGER.debug("Empty Response Body"); 
        } 
        return responseWrapper; 
       }catch (IOException io){ 
        REQ_RES_LOGGER.error("Unexpected Error ",io); 
        return response; 
       } 

     } 
    } 

ответ

2

Я, наконец, выяснил способ использования этого класса. Поскольку это последний класс, он предназначен для использования только в Springframework. Для этого изменения была pull request. Я не уверен, когда это изменение будет объединено в рамках, но ниже будут классы, которые разрешат вышеупомянутую проблему. Эти классы были бы полезны, если мы хотим перехватить запрос и ответ для ведения журнала.

BufferingAsyncClientHttpRequestFactory

public class BufferingAsyncClientHttpRequestFactory extends 

BufferingClientHttpRequestFactory 
     implements AsyncClientHttpRequestFactory { 

    private final AsyncClientHttpRequestFactory requestFactory; 
    /** 
    * Create a buffering wrapper for the given {@link ClientHttpRequestFactory}. 
    * @param requestFactory the target request factory to wrap 
    */ 
    public BufferingAsyncClientHttpRequestFactory(AsyncClientHttpRequestFactory requestFactory) { 
     super((ClientHttpRequestFactory) requestFactory); 
     this.requestFactory=requestFactory; 
    } 


    /** 
    * Indicates whether the request/response exchange for the given URI and method 
    * should be buffered in memory. 
    * <p>The default implementation returns {@code true} for all URIs and methods. 
    * Subclasses can override this method to change this behavior. 
    * @param uri the URI 
    * @param httpMethod the method 
    * @return {@code true} if the exchange should be buffered; {@code false} otherwise 
    */ 

    @Override 
    public AsyncClientHttpRequest createAsyncRequest(URI uri, HttpMethod httpMethod) throws IOException { 
     AsyncClientHttpRequest request = requestFactory.createAsyncRequest(uri, httpMethod); 
     if (shouldBuffer(uri, httpMethod)) { 
      return new BufferingAsyncClientHttpRequestWrapper(request); 
     } 
     else { 
      return request; 
     } 
    } 

    protected boolean shouldBuffer(URI uri, HttpMethod httpMethod) { 
     return true; 
    } 


} 

BufferingAsyncClientHttpRequestWrapper.java

public class BufferingAsyncClientHttpRequestWrapper extends AbstractBufferingAsyncClientHttpRequest { 

    private final AsyncClientHttpRequest request; 

    public BufferingAsyncClientHttpRequestWrapper(AsyncClientHttpRequest asyncClientHttpRequest){ 
     this.request=asyncClientHttpRequest; 
    } 

    @Override 
    public HttpMethod getMethod() { 
     return this.request.getMethod(); 
    } 

    @Override 
    public URI getURI() { 
     return this.request.getURI(); 
    } 

    @Override 
    protected ListenableFuture<ClientHttpResponse> executeInternal(HttpHeaders headers, byte[] bufferedOutput) throws IOException { 
     this.request.getHeaders().putAll(headers); 
     if(bufferedOutput.length>0){ 
      StreamUtils.copy(bufferedOutput,this.request.getBody()); 
     } 
     ListenableFuture<ClientHttpResponse> futureResponse = this.request.executeAsync(); 
     ListenableFutureAdapter<ClientHttpResponse,ClientHttpResponse> bufferedResponse = 
       new ListenableFutureAdapter<ClientHttpResponse, ClientHttpResponse>(futureResponse) { 
        @Override 
        protected ClientHttpResponse adapt(ClientHttpResponse adapteeResult) throws ExecutionException { 
         return new BufferingClientHttpResponseWrapper(adapteeResult); 
        } 
       }; 
     return bufferedResponse; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^