Webservice - создание клиентского сервиса - PullRequest
14 голосов
/ 08 июля 2011

Знаете ли вы, сколько стоит создание экземпляра службы клиента веб-сервиса?

 JavaWebService service = new JavaWebService();
 SomePort port = service.getJavaWebServicePort(); 

Создание службы один раз и после этого повторное использование одного и того же порта в многопоточной среде (webapp) не опасно?

Прочитайте, что порт getPort и сам порт не являются поточно-ориентированными, но при каждом создании службы могут возникнуть проблемы, если это дорогостоящая операция.

Есть идеи?

1010 * БЛАГОДАРЯ *

Ответы [ 2 ]

15 голосов
/ 11 января 2012

В эталонной реализации JAX-WS (Metro) создание JavaWebService стоит недорого (у наших сгенерированных клиентов мы склонны считать, что это занимает около 20 мс).

Первое создание SomePort довольно дорого (около 200 мс для нас); последующие вызовы getSomePort() в том же экземпляре JavaWebService выполняются значительно быстрее (для нас это примерно 3 мс).

Таким образом, реализация, которая создает JavaWebService каждый раз, когда ей нужно получить SomePort, будет нести определенную степень затрат. Короче говоря, ответ на вопрос «довольно дорого».

Однако, хотя методы SomePort не являются поточно-ориентированными, методы JavaWebService являются. Таким образом, разумный шаблон использования (по крайней мере, с Metro - потокобезопасность зависит от конкретной реализации из-за отсутствия спецификации) - это повторное использование JavaWebService, поскольку дорогой вызов getSomePort() будет выполняться только один раз.

Обновление

Это согласуется с двумя постами Андреаса Леоу, сотрудника Oracle в Германии, одного из постеров в ветке, на которую ссылается @PapaLazarou в комментарии ниже, который написал относительно объекта Service,

Вы можете создать только один статический Service экземпляр для каждого WSDL: любой отдельный Service объект полностью поточнобезопасен и может совместно использоваться любым количеством одновременно работающих потоков.

и про использование портов

Хотя я почти на 100% уверен, что порты CXF JAX-WS являются поточно-ориентированными, объекты Metro Port определенно не поточно-безопасны.

4 голосов
/ 08 июля 2011

Если вы используете jax-ws, то вы не можете совместно использовать порт между потоками (они не являются потокобезопасными).если вы обеспокоены накладными расходами на создание порта (и измерили его и подтвердили, что это является узким местом в вашем приложении), то вы можете создать пул соединений портов.

...