Главная » Spring » Проксирование  служб  JAX-WS на стороне клиента Spring

0

Экспортирование веб-служб в Spring существенно отличается от экспортирования служб RMI, Hessian, Burlap и Http Invoker. Но, как вскоре будет показано, использование веб-служб с помощью Spring на стороне клиента связано с применением прокси-объектов почти так же, как это делается при использовании других технологий уда- ленных взаимодействий.

С помощью компонента JaxWsPortProxyFactoryBean можно реализо- вать внедрение веб-службы Spitter, как если бы это был другой ком- понент. JaxWsPortProxyFactoryBean – это фабричный компонент, создаю- щий прокси-объекты, способные взаимодействовать с веб-службами по протоколу SOAP. Сам прокси-объект реализует интерфейс служ- бы (рис. 11.10). Таким образом, компонент JaxWsPortProxyFactoryBean делает возможным внедрение и использование удаленной веб-служ- бы, как если бы это был любой другой локальный POJO.

Настройка JaxWsPortProxyFactoryBean для доступа к веб-службе Spitter выполняется следующим образом:

<bean    id="spitterService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean" p:wsdlDocumentUrl="http://localhost:8080/services/SpitterService?wsdl" p:serviceName="spitterService"

p:portName="spitterServiceHttpPort" p:serviceInterface="com.habuma.spitter.service.SpitterService" p:namespaceUri="http://spitter.com"/>

Рис. 11.10. Компонент JaxWsPortProxyFactoryBean создает прокси-объекты, взаимодействующие с удаленными

веб-службами. Эти прокси-объекты можно внедрять в другие компоненты, подобно локальным POJO

Как видно из этого примера, для нормальной работы в настройках компонента JaxWsPortProxyFactoryBean необходимо определить значе- ния нескольких свойств. Свойство wsdlDocumentUrl определяет место- положение файла определения удаленной веб-службы. Этот WSDL- файл будет использоваться компонентом JaxWsPortProxyFactoryBean для конструирования  прокси-объекта,  обеспечивающего  доступ к службе. Как указывает свойство serviceInterface, прокси-объект, со- здаваемый компонентом JaxWsPortProxyFactoryBean, реализует интер- фейс   SpitterService.

Значения для трех остальных свойств обычно легко можно найти в WSDL-файле определения службы. Для примера предположим, что WSDL-файл службы Spitter содержит следующие строки:

<wsdl:definitions    targetNamespace="http://spitter.com">

<wsdl:service name="spitterService">

<wsdl:port  name="spitterServiceHttpPort"

binding="tns:spitterServiceHttpBinding">

</wsdl:port>

</wsdl:service>

</wsdl:definitions>

Хотя это и не типично, но в одном файле WSDL может быть объявлено несколько служб и/или портов. По этой причине в на-

В заключение

507

стройках компонента JaxWsPortProxyFactoryBean требуется указывать порты и имена служб в свойствах portName и serviceName соответствен- но. Атрибуты name в элементах <wsdl:port> и <wsdl:service> помогут быстро выяснить значения для этих свойств.

Наконец, свойство namespaceUri определяет пространство имен службы. Кроме всего прочего, пространство имен помогает компонен- ту JaxWsPortProxyFactoryBean отыскать определение службы в WSDL- файле. Как и в случае с портами и именами служб, вы легко смо- жете определить значение этого свойства, заглянув в файл WSDL. Обычно пространство имен определяется атрибутом targetNamespace элемента   <wsdl:definitions>.

В заключение

Реализация взаимодействий с удаленными службами чаще все- го является весьма утомительным занятием. Но фреймворк Spring предоставляет поддержку удаленных взаимодействий, которая де- лает работу с удаленными службами такой же простой, как работа с обычными компонентами JavaBeans.

Для клиентских приложений Spring может предложить фабрич- ные компоненты, создающие прокси-объекты, которые позволяют настраивать использование удаленных служб в приложениях Spring. Независимо от типа используемой службы – RMI, Hessian, Burlap, Spring HTTP Invoker или веб-службы – удаленные службы могут внедряться в приложения как обычные POJO. Более того, фрейм- ворк Spring даже перехватывает все исключения RemoteExceptions и повторно возбуждает исключение времени выполнения Remote- AccessExceptions, освобождая программиста от необходимости писать шаблонный код обработки исключений, что в большинстве случаев не имеет большого смысла.

Даже при том, что фреймворк Spring скрывает многие детали взаимодействий с удаленными службами, делая их подобными обычным локальным компонентам JavaBeans, не следует забывать о проблемах служб, являющихся следствием их удаленности. Удален- ные службы по своей природе обычно менее эффективны, по срав- нению с локальными службами. Это обстоятельство следует также учитывать и при разработке удаленных служб, стараясь уменьшить количество необходимых удаленных вызовов, чтобы избежать су- щественного падения производительности.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии