Доступ к моему веб-приложению осуществляется через 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
для одновременного выполнения вызовов?
Короткий ответ на ваш вопрос ... нет. Вот длинный ответ:
Ваш код напрямую зависит от 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-клиентская документация - или дайте мне знать, если вам нужен пример.