Клиент CXF загружает wsdl для службы и порта? - PullRequest
2 голосов
/ 11 февраля 2012

В веб-приложении java мне нужно вызвать удаленный сервис мыла, и я пытаюсь использовать клиент, сгенерированный CXF 2.5.0. Служба soap предоставляется конкретным поставщиком ERP, и его wsdl является чудовищным, тысячи типов, десятки импортов xsd и т. Д. Wsdl2java генерирует клиента нормально, благодаря флагу -autoNameResolution. Но во время выполнения он извлекает удаленный wsdl дважды, один раз, когда я создаю объект службы, и снова, когда я создаю объект порта.

MyService_Service myService = new MyService_Service(giantWsdlUrl);  // fetches giantWsdl
MyService myPort = myService.getMyServicePort();  // fetches giantWsdl again

Почему это? Я могу понять, как его извлекать при создании myService, вы хотите видеть, что он соответствует клиенту, которым я сейчас пользуюсь, или позволить расположению wsdl среды выполнения определять адрес конечной точки и т. Д. Но я не понимаю, почему запрос на порт перезагрузит все это просто вышло на провод для. Я что-то упустил?

Так как это в веб-приложении, и я не могу быть уверен, что myPort является поточно-безопасным , тогда мне придется создать порт для каждого потока, за исключением того, что это слишком медленно, 6 8 секунд благодаря чудовищному WSDL. Или добавьте мое собственное объединение, создайте группу заранее, и сделайте проверки и проверки. Тьфу.

Для справки, маршрут создания JaxWsProxyFactoryBean не не когда-либо извлекает wsdl, и это хорошо для моей ситуации. На первый create () все еще уходит много времени, затем на последующие create () примерно четверть секунды, и даже это меньше, чем хотелось бы. И я не знаю ... это похоже на то, что я под капюшоном разогреваю вещь, а не поворачиваю ключ. :)

1 Ответ

1 голос
/ 12 февраля 2012

Ну, вы на самом деле сами ответили на вопрос. Каждый раз, когда вы вызываете service.getPort(), WSDL загружается с удаленного сайта и анализируется. JaxWsProxyFactoryBean идет абсолютно так же, но как только прокси получен, он снова используется для дальнейших вызовов. Вот почему первый прогон медленный (из-за «разогрева»), но последующий - быстрый.

И да, JaxWsProxyFactoryBean не является потокобезопасным. Пул клиентских прокси является опцией, но, к сожалению, потребляет много памяти, так как модель времени выполнения JAX-WS не распределяется между клиентскими прокси ; Синхронизация, возможно, лучший способ следовать.

...