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

Използвам RestTemplate заедно с неговата фабрика HttpComponentsClientHttpRequestFactory в един от моите проекти. В този проект трябва да направя Http url извикване към моя сървър, който изпълнява спокойна услуга, която връща отговора като 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, докато го конструирате, тъй като по подразбиране тази фабрика използва системни свойства, за да създаде HttpClient за вашата фабрика и това може да причини много болка в производствената среда. Можете също да подадете своя персонализиран HttpClient.

person Youness    schedule 06.04.2015