У меня есть bean-компонент EJB3, который должен получить или отправить сообщение с нескольких HTTP-серверов. Я прочитал документацию по написанию адаптеров JCA, а также документацию по HTTP-компонентам Apache, в частности, по управляемым соединениям, фабрикам управляемых соединений и т. д., которые предлагает HTTPClient.
Я отмечаю, что документация для BasicHttpClientConnectionManager предлагает использовать его, а не PoolingHttpClientConnectionManager "Внутри контейнера EJB". Неясно, относится ли «Внутри контейнера EJB» к пользовательскому коду в EJB, который должен быть запущен в контейнере, или к собственному коду реализации контейнера (например, к тому, что вы можете поместить в адаптер JCA.
С точки зрения архитектуры я все еще немного не понимаю, как справиться с задачей, чтобы максимально использовать преимущества услуг, предлагаемых контейнером. Пока мой выбор выглядит следующим образом:
Внутри EJB создайте новый BasicHttpClientConnectionManager, а затем создайте клиента, например:
BasicHttpClientConnectionManager cxMgr = new BasicHttpClientConnectionManager() HttpClients.custom().setConnectionManager(cxMgr).build()
Я полагаю, что это приведет не к пулу соединений, а к пулу экземпляров EJB, что, вероятно, не будет столь эффективным, поскольку контейнер EJB не имеет возможности узнать, какой экземпляр компонента поддерживает активное соединение с каким удаленным HTTP-сервером.
Напишите (достаточно минимальный) адаптер JCA, который обертывает PoolingHttpClientConnectionManager, а затем внутри EJB возьмите этот адаптер с аннотацией @Resource и используйте его для создания HTTPClient.
Напишите адаптер JCA, который управляет пулом HTTPClient и передает их по мере необходимости.
Мне неясно, какой подход мне следует использовать, и игнорирую ли я какую-то службу управления HTTP-соединениями, которая уже встроена в контейнер (в данном случае TomEE plus). Как мне это сделать?