Как эффективно использовать HttpComponentsClientHttpRequestFactory с RestTemplate?

Я использую RestTemplate вместе с его фабрикой HttpComponentsClientHttpRequestFactory в одном из моих проектов. В этом проекте мне нужно сделать вызов URL-адреса Http на мой сервер, на котором запущена служба отдыха, которая возвращает ответ в виде строки JSON.

Ниже мой код -

public class GetUserClientData {

    public String getData(KeyHolder keys) {
        return new HTTPRequestAccess(keys).makeHttpRequest();
    }
}

Ниже мой класс, который обертывает часть HttpClient -

public class HTTPRequestAccess {

    // should this be static?
    private RestTemplate restTemplate;
    private KeyHolder keys;
    private int timeout;

    public HTTPRequestAccess(KeyHolder keys){
        this(keys.getTimeoutValue()); // setting timeout to RestTemplate
        this.keys = keys;
    }

    public HTTPRequestAccess(int timeout) {
        this.timeout = timeout;
        restTemplate = new RestTemplate(clientHttpRequestFactory());
    }

    private ClientHttpRequestFactory clientHttpRequestFactory() {
        // is this not expensive that every time we are creating this new object?
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.setReadTimeout(timeout);
        factory.setConnectTimeout(timeout);
        return factory;
    }

    public String makeHttpRequest() {
        String response = null;        
        try {
            // some logic here

            String url = generateURL();
            response = restTemplate.getForObject(url, String.class);

            // some logic here
        } catch (RestClientException ex) {
            // log exception and do some stuff
        } catch (Exception ex) {
            // log exception
        }

        return response;
    }
}

Должны ли RestTemplate и HttpComponentsClientHttpRequestFactory быть статическими здесь, в моем классе HTTPRequestAccess, как если бы я это правильно понял, я воссоздаю весь пул соединений для каждого запроса в RestTemplate, что, я думаю, неправильно, потому что у каждой фабрики есть соединение и пул потоков, и они довольно тяжелый предмет, я думаю.

В общем, как лучше всего использовать RestTemplate вместе с его фабрикой HttpComponentsClientHttpRequestFactory в многопоточной среде? Я предполагаю, что RestTemplate является потокобезопасным, но я не думаю, что HttpComponentsClientHttpRequestFactory является потокобезопасным. Поправьте меня, если я ошибаюсь? Я буду запускать эту библиотеку под большой нагрузкой.

Я использую spring-web-3.2.8.RELEASE версию.


person AKIWEB    schedule 06.04.2015    source источник


Ответы (1)


В одном из моих проектов я создал статический экземпляр HttpComponentsClientHttpRequestFactory и передал его каждому RestTemplate. Хотя в здесь предлагается также иметь глобальный экземпляр RestTemplate .

Возможно, это не имеет значения, но один важный момент — передать HttpClients.createDefault() в ваш HttpComponentsClientHttpRequestFactory при его создании, поскольку по умолчанию этот factory использует системные свойства для создания HttpClient для вашего factory, и это может вызвать много боли в производственной среде. Вы также можете передать свой собственный HttpClient.

person Youness    schedule 06.04.2015