RestTemplate устанавливает тайм-аут чтения, а также ведет запись ответов на запросы. - PullRequest
0 голосов
/ 27 февраля 2019

Я сослался на множество SO-ссылок, чтобы сделать следующее.

  1. RestTemplate установил тайм-аут чтения и соединения
  2. RestTemplate регистрирует ответы на запросы

Для этого япопробовал приведенные ниже коды.

Попытка 1: для установки таймаута чтения и подключения я пробовал решение ниже.

@Component
public class RestTemplateInitializer implements ApplicationListener<ApplicationReadyEvent> {

    @Value("${my.api.timeout}")
    private int myTimeOut;

    public static HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();

    @Override
    public void onApplicationEvent(ApplicationReadyEvent arg0) {
        clientHttpRequestFactory.setConnectTimeout(myTimeOut);
        clientHttpRequestFactory.setReadTimeout(myTimeOut);
    }


}

И для создания RestTemplate, я пробовал как ниже.

RestTemplate restTemplate = new RestTemplate(RestTemplateInitializer.clientHttpRequestFactory);

Попытка 2: ведение журнала запросов-ответов.

public class RequestResponseLoggingInterceptor implements ClientHttpRequestInterceptor {

    private LoggerUtil log = LoggerUtil.getInstance();

    private final String className = "RequestResponseLoggingInterceptor";

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException
    {
        logRequest(request, body);
        ClientHttpResponse response = execution.execute(request, body);
        logResponse(response);

        //Add optional additional hostHeaders
        response.getHeaders().add("headerName", "VALUE");

        return response;
    }

    private void logRequest(HttpRequest request, byte[] body) throws IOException {
        final String methodName = "logRequest";
        log.doLog(4, className, methodName, "===========================request begin================================================");
        log.doLog(4, className, methodName, "URI         : {}"+request.getURI());
        log.doLog(4, className, methodName, "Method      : {}"+request.getMethod());
        log.doLog(4, className, methodName, "Headers     : {}"+request.getHeaders());
        log.doLog(4, className, methodName, "Request body: {}"+new String(body, "UTF-8"));
        log.doLog(4, className, methodName, "==========================request end================================================");
    }

    private void logResponse(ClientHttpResponse response) throws IOException {
        final String methodName = "logResponse";
        log.doLog(4, className, methodName, "============================response begin==========================================");
        log.doLog(4, className, methodName, "Status code  : {}"+response.getStatusCode());
        log.doLog(4, className, methodName, "Status text  : {}"+response.getStatusText());
        log.doLog(4, className, methodName, "Headers      : {}"+response.getHeaders());
        log.doLog(4, className, methodName, "Response body: {}"+StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()));
        log.doLog(4, className, methodName, "=======================response end=================================================");
    }
}

А для создания RestTemplate я пробовал, как показано ниже.

RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
restTemplate.getInterceptors().add(new RequestResponseLoggingInterceptor());
restTemplate.getInterceptors().add(new BasicAuthenticationInterceptor("Test", "Test"));

проблема с вышеупомянутыми двумя решениями, я не могу смешать и сопоставить эти два.то есть я не могу установить время ожидания чтения и подключения при ведении журнала ответа на запрос, потому что new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()) не позволяет мне установить время ожидания чтения и подключения.И когда я использую new RestTemplate(RestTemplateInitializer.clientHttpRequestFactory), я не могу прочитать ответ дважды.

Есть ли у нас решение, которое делает обе вещи?Заранее спасибо!!

приветствует программирование !!

...