Как настроить клиент JAX-RS для одновременного совершения звонков

Доступ к моему веб-приложению осуществляется через http, и он сам выполняет http-вызовы. Для этого я использую jaxrs-client. Поскольку Клиент считается дорогим ресурсом, он инициализируется один раз и повторно используется в запросах.

Client client = ClientBuilder.newClient();
WebTarget webTarget = client.target(baseUri).path(...);

Во время запросов http-вызов делается так:

Builder request = webTarget.request(MediaType.APPLICATION_JSON);
Response response = request.post(...);
try {
    // evaluate response
}
finally {
    response.close();
}

Так что все работает нормально, пока веб-приложение развернуто на TomEE или параллелизм отсутствует. Но когда код выполняется одновременно в Wildfly, он не работает с

Caused by: java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated.
Make sure to release the connection before allocating another one.
  at org.apache.http.util.Asserts.check(Asserts.java:34)
  at org.apache.http.impl.conn.BasicClientConnectionManager.getConnection(BasicClientConnectionManager.java:162)
  at org.apache.http.impl.conn.BasicClientConnectionManager$1.getConnection(BasicClientConnectionManager.java:144)
  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:423)
  at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:882)
  at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)

Ошибка генерируется Wildfly, по-видимому, используя apache-httpclient как часть своего поставщика реализации JAXRS.

Спрашивая Google, можно получить подсказки, рекомендующие настройки для REST-EASY или apache-httpclient (размер пула или конкретный HttpClientConnectionManager). Но мое приложение не зависит ни от одного из них. Это просто зависит от javax:javaee-api:7.0

Мой вопрос: есть ли независимый от производителя способ настроить javax.ws.rs.client.Client для одновременного выполнения вызовов?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
844
1

Ответы 1

Короткий ответ на ваш вопрос ... нет. Вот длинный ответ:

Ваш код напрямую зависит от jax-rs api (интерфейсов), определенных в javaee-api. Вы развертываете код в wildfly, среда выполнения которого предоставляет Rest-Easy как частную реализацию JAX-RS. Управление зависимостями / загрузка классов Wildfly заботится о загрузке конкретной реализации Rest-Easy jax-rs api.

Rest-Easy использует http-клиент apache (клиент apache-http - это нет, реализация jax-rs api, Rest Easy - это) в качестве основного http-клиента. Без конфигурации клиент apache-http будет работать с BasicClientConnManager по умолчанию. Для обработки одновременных запросов вам необходимо явно настроить многопоточный диспетчер соединений - подробности см. В документации apache http-client http-клиентская документация - или дайте мне знать, если вам нужен пример.

Другие вопросы по теме