Параллельность HttpClient в синглтоне - PullRequest
0 голосов
/ 04 февраля 2020

Я использую Spring Boot и создал сервис (часть Microservices Design). У меня есть метод ниже,

public static HttpClient getHttpClient() throws KeyManagementException, NoSuchAlgorithmException {

        log.info("Creating Http Client...");
        final SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
                new SSLContextBuilder().build());
        final PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        connectionManager.setMaxTotal(200);
        connectionManager.setDefaultMaxPerRoute(20);

        return HttpClients.custom()
                .disableRedirectHandling()
                .setSSLSocketFactory(sslConnectionSocketFactory)
                .setConnectionManager(connectionManager)
                .build();
    }

Я вызываю этот метод несколько раз, хотел сохранить только один экземпляр и повторно использовать его после создания. Учитывая параллельное программирование, могу ли я использовать Singleton Pattern? и я вижу, RestTemplate является довольно хорошим подходом, а не Apache Http-клиент по ссылке ниже,

RestTemplate vs Apache Http-клиент для производственного кода в весеннем проекте

Предложение высоко ценится.

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Я бы предложил вам использовать пружину RestTemplate . Создайте экземпляр RestTemplate только один раз в своем приложении, а затем используйте его в нескольких классах служб / компонентов, используя внедрение зависимостей.

Лучший способ создать экземпляр RestTemplate - это зарегистрировать его в качестве пружинного компонента в классе конфигурации пружины. Это создаст экземпляр RestTemplate во время запуска приложения. Ниже кода будет создан один экземпляр RestTemplate, и он может использоваться несколькими классами.

@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
//if you want to set any properties in RestTemplate, set here
return restTemplate;
}

Теперь, чтобы использовать RestTemplate в любом классе обслуживания, используйте внедрение зависимости:

@Service
class TestService {

@Autowired
private RestTemplate restTemplate

public void invokeRemoteService(){
//Here you are using restTemplate 
  String response = 
      restTemplate.postForObject(url, request, String.class);
}

}
0 голосов
/ 04 февраля 2020

Прежде всего вы должны использовать Dependency Injection ядра пружины вместо прямого метода для получения экземпляра, работающего в Spring. Контейнер внедрения зависимостей (DI) создаст для вас необходимый экземпляр и внедрит его. При этом вы можете настроить DI-контейнер, как часто будет генерироваться экземпляр, устанавливая область действия или используя специальные аннотации. Хорошее объяснение с примерами кода для DI в Spring с пользовательскими областями можно найти здесь: https://www.baeldung.com/spring-bean-scopes

Во-вторых, я бы рекомендовал использовать Spring RestTemplate и настроить его для ваших нужд через RestTemplateBuilder или RestTemplateCustomizer https://www.baeldung.com/spring-rest-template-builder С помощью пружины RestTemplate уже имеется множество классов настройки Test, чтобы упростить тестирование JUnit из коробки, и рекомендуется использовать предоставленную пружину, если вы уже работаете внутри Spring Spring.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...