У меня есть клиент Джерси и работает, используя библиотеку Apache Client 4, например:
private Client createClient() {
ApacheHttpClient4Config cc = new DefaultApacheHttpClient4Config();
// boring stuff here
return ApacheHttpClient4.create(cc);
}
Но по умолчанию используется BasicClientConnManager
, который не позволяет многопоточные подключения.
ApacheHttpClient4Config
Javadoc говорит, что мне нужно установить PROPERTY_CONNECTION_MANAGER
в экземпляр ThreadSafeClientConnManager
если мне нужна многопоточная операция. Я могу это сделать, и он работает нормально:
private Client createClient() {
ApacheHttpClient4Config cc = new DefaultApacheHttpClient4Config();
cc.getProperties().put(ApacheHttpClient4Config.PROPERTY_CONNECTION_MANAGER,
new ThreadSafeClientConnManager());
// boring stuff here
return ApacheHttpClient4.create(cc);
}
Но ThreadSafeClientConnManager
устарел. Это раздражает.
Более современная версия - PoolingHttpClientConnectionManager
. К сожалению, метод ApacheHttpClient4.create()
требует, чтобы диспетчер соединений был реализацией ClientConnectionManager
(сам устарел), а PoolingHttpClientConnectionManager
не реализует этот интерфейс. Поэтому, если я пытаюсь его использовать, мой диспетчер подключений игнорируется, и мы возвращаемся к BasicClientConnManager
.
Как я могу создать потокобезопасный клиент, не используя ничего, что устарело?
Вы можете создать клиент следующим образом (см. Https://github.com/phillbarber/connection-leak-test/blob/master/src/test/java/com/github/phillbarber/connectionleak/IntegrationTestThatExaminesConnectionPoolBeforeAndAfterRun.java#L30-L33):
client = new ApacheHttpClient4(new ApacheHttpClient4Handler(HttpClients.custom()
.setConnectionManager(new PoolingHttpClientConnectionManager())
.build(), null, false));