Ответ 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
определенно не являются потокобезопасными.