Я использую 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
версию.