Является ли клиентская лента JAX-RS безопасной

В Java EE7 клиентский API JAX-RS предоставляет API-интерфейс высокого уровня для доступа к любым ресурсам REST. Согласно документации, "Клиенты - это тяжелые объекты, которые управляют инфраструктурой связи на стороне клиента. Инициализация, а также удаление экземпляра клиента могут быть довольно дорогостоящей операцией. Поэтому рекомендуется создавать только небольшое количество экземпляров клиента в приложении."

Чтобы избежать частого создания клиента, я собираюсь кэшировать экземпляр клиента и повторно его использовать. Является ли поток экземпляра клиента безопасным, поскольку он может использоваться параллельными потоками? Есть ли проблема с производительностью, если я создаю экземпляр клиента и повторно использую его для всех запросов?

Ответ 1

JavaDoc чаще всего отвечает на ваш вопрос - да, он потокобезопасен, и вы можете и должны его повторно использовать. Может возникнуть проблема с производительностью из не повторного использования, т.е. Если вы создадите клиент для каждого HTTP-запроса, который заставит вашу производительность сосать очень плохо.

Ответ 2

Я не уверен, но я думаю, что это решение для конкретной реализации.

Я не мог найти в спецификации JAX-RS 2.0, ни в Javadoc ничего, предоставляя javax.ws.rs.client.Client поточно-безопасным. Но в документации Restaasy (разработчик JAX-RS) я нашел:

Одно решение по умолчанию, принятое HttpClient и принятое Resteasy, - это использование org.apache.http.impl.conn.SingleClientConnManager, которое управляет одним сокетом в любой момент времени и который поддерживает использование случай, когда одно или несколько вызовов производятся поочередно из одного нить. Для многопоточных приложений SingleClientConnManager может быть заменен на org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager:

ClientConnectionManager cm = new ThreadSafeClientConnManager();
HttpClient httpClient = new DefaultHttpClient(cm);
ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient);

Источник: http://docs.jboss.org/resteasy/docs/3.0.9.Final/userguide/html/RESTEasy_Client_Framework.html#transport_layer

Основываясь на этой информации, я думаю, что ответ на ваш вопрос скорее всего будет "нет".