Подтвердить что ты не робот

Webservice - создание клиентского сервиса

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

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

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

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

Любая идея?

спасибо

4b9b3361

Ответ 1

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

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

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

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

Обновление

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

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

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

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

Ответ 2

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