Как настроить клиент 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 для одновременного выполнения вызовов?

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-клиентская документация - или дайте мне знать, если вам нужен пример.

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