среда, 6 июля 2011 г.

Трансформация сообщений в Oracle Service Bus с использованием XSLT и XQuery


Продолжаем знакомство с потоком обработки сообщений (Message Flow) Oracle Service Bus (OSB). Сегодня мы рассмотрим как настроить трансформацию сообщений из одного XML-формата в другой перед вызовом Business Service, используя XQuery- и XSLТ-преобразования. Разовьем пример, начатый в предыдущей заметке.

Использование действия Replace


Напомню, что нам необходимо настроить трансформацию XML-сообщения, описываемого схемой

  1.     <xsd:element name="sendMessage">

  2.         <xsd:complexType>

  3.           <xsd:sequence>

  4.             <xsd:element name="country">

  5.                 <xsd:simpleType>

  6.                     <xsd:restriction base="xsd:string">

  7.                         <xsd:maxLength value="3"/>

  8.                     </xsd:restriction>

  9.                 </xsd:simpleType>

  10.             </xsd:element>

  11.             <xsd:element name="header" type="xsd:string"/>

  12.             <xsd:element name="body" type="xsd:string"/>          

  13.           </xsd:sequence>

  14.         </xsd:complexType>

  15.       </xsd:element>



в XML-сообщение, описываемое схемой

  1.   <xsd:element name="message">

  2.     <xsd:complexType>

  3.         <xsd:sequence>

  4.             <xsd:element name="header" type="xsd:string"/>

  5.             <xsd:element name="body" type="xsd:string"/>

  6.         </xsd:sequence>

  7.         <xsd:attribute name="country">

  8.             <xsd:simpleType>

  9.                 <xsd:restriction base="xsd:string">

  10.                     <xsd:maxLength value="3"/>

  11.                 </xsd:restriction>

  12.             </xsd:simpleType>

  13.         </xsd:attribute>

  14.     </xsd:complexType>    

  15.   </xsd:element>



Чтобы изменить сообщение, отправляемое на Business Service, в потоке обработки сообщения необходимо заменить значение переменной body. Для замены значения переменной используется действие Replace. С помощью действия Replace можно заменять как XML-узел (Node), представляющий собой значение переменной или его часть, так и содержимое данного узла.

Прежде всего необходимо поместить действие Replace в поток обработки сообщений, в ветку Request Action блока Dynamic Routing, перетащив его с палитры компонентов.



Настроить свойства действия Replace можно на вкладке Replace в виде Properties. С помощью параметра XPath, представляющего собой XPath-выражение, выбирается узел, который или содержимое которого необходимо заменить. С помощью параметра In Variable выбирается переменная, к значению которой будет применяться XPath-выражение. Параметр Expression задает непосредственно выражение, на значение которого будет произведена замена. Переключатели Replace entire node и Replace node content определяют что именно подлежит замене: XML-узел или его содержимое.



Стоит отметить, что если замене подлежит узел, а значение выражения Expression пустое, то данный узел будет удален. Если же замене подлежит содержимое узла, то узел в таком случае станет пустым.

При нажатии на ссылку, расположенную напротив параметра XPath, откроется окно редактирования XPath-выражения. Данное окно состоит из двух областей: Expression - поле для ввода выражения и блока выбора параметров. В качестве параметров выражения могут выступать переменные, пространства имен и функции XQuery. Добавить параметр в окно редактирования выражения можно перетаскиванием его с соответствующей вкладки.



При нажатии на ссылку, расположенную напротив параметра Expression, откроется окно редактирования выражения, применяемого при трансформации. Вкладка Expression данного окна позволяет задать XML-выражение, на которое будет заменен выбранный узел или его содержиимое. XML-выражение может включать в себя вызовы XQuery-функций, которые должны быть взяты в фигурные скобки.



Использование XQuery-преобразований


Помимо задания XML-выражения можно использовать XQuery- и XSLT-преобразования. В состав Oracle Enterprise Pack for Eclipse входит удобный графический редактор для файлов XQuery-преобразований.

Прежде чем использовать XQuery-преобразования, необходимо создать их описание в файле с расширением xq. Создать такой файл можно путем вызова пункта New -> XQuery Transformation контекстного меню вида Project Explorer.



После вызова данного пункта меню появится мастер создания файла XQuery-преобразований. На первом шаге мастера необходимо указать расположение файла и ввести его название.



На втором шаге мастера необходимо выбрать источники. Источниками (т.е. тем, что будет преобразовываться) могут быть как XML типы данных, так и не-XML, а так же простые типы данных (строки, числа и т.д.).



И наконец, на третьем - последнем шаге мастера необходимо выбрать целевой тип - тип, в который будет осуществляться преобразование. Целевым типом так же может быть как XML, так и не-XML или простой тип данных.



После завершения работы мастера файл будет создан и откроется перспектива XQuery Transformation. В данной перспективе расположены виды, предназначенные для управления преобразованием:

  • Target Expression - отображаются выполняемые преобразования на языке XQuery;

  • Constraints - позволяет задать ограничения, накладываемые на операции преобразования;

  • Expression Variables - отображаются переменные, которые можно использовать в преобразовании;

  • Expression Functions - отображаются функции, которые можно использовать в преобразовании. Функции разделены на ряд групп: функции для работы с OSB, функции, для работы со строками, функции для работы с числами, и т.д. Есть даже функция execute-sql, позволяющая выполнять SQL-выражения.





Непосредственно преобразования задаются путем соединения стрелками нужных компонентов типа-источника и типа-цели.



После того как xq-файл создан и преобразования в нем настроены, его нужно выбрать в качестве значения свойства Expression операции Replace. Для этого необходимо открыть мастер редактирования свойства Expression, перейти на вкладку XQuery Resources и с помощью кнопки Browse выбрать созданный файл TransformToMessage.xq.



После выбора файла появится поле Bind Variables, в котором необходимо настроить связывание параметров-источников с реальными переменными. В нашем случае в качестве источника будет использоваться переменная body.



Использование XSLT-преобразований


Прежде чем использовать XSLT-преобразования для трансформации, по аналогии с XQuery необходимо сначала создать соответствующий файл. В состав Oracle Enterprise Pack for Eclipse не входит графический редактор файлов XSLT-преобразований, однако такой редактор входит в состав JDeveloper. Им мы и воспользуемся.

Для создания нового файла необходимо воспользоваться пунктом меню File -> New. В появившемся окне New Galery на вкладке All Technologies выбрать категорию XML, пункт XSL Map.



В появившемся окне Create XSL Map File необходимо задать имя создаваемого файла, выбрать каталог, в котором данный файл будет создан - CountryRouter/Transformations/, выбрать тип-источник - sendMessage и целевой тип - message.



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



После завершения редактирования XSLT-файла, его необходимо выбрать в качестве значения свойства Expression операции Replace. Для этого нужно открыть мастер редактирования свойства Expression, перейти на вкладку XSLT Resources и с помощью кнопки Browse выбрать созданный файл ToMessageTransform.xsl. Аналогично настройке XQuery преобразования, после выбора файла необходимо задать связывание параметров-источников со значениями переменных.



Тестирование трансформации сообщений


После настройки действия Replace любым из описанных выше способов, необходимо развернуть проект на сервере OSB. Протестировать Proxy Service можно в консоли управления OSB, перейдя в каталог ProxyServices проекта CountryRouter и нажав там кнопку Launch Test Console у ресурса CountryProxyService2.



В появившемся окне необходимо отредактировать параметры тестового запроса и нажать кнопку Execute.



После выполнения запроса отобразится окно результата, в котором видно, что запрос выполнился успешно, а в качестве ответа была возвращена строка ENG.



В Enterprise Manager можно посмотреть содержимое последнего полученного сервисом SomeServiceEng сообщения. Видно, что формат данного сообщения является тем самым форматом, который использовался при создании сервиса. Т.е. преобразование работает корректно.



Помимо настройки динамической маршрутизации и трансформации сообщений Oracle Service Bus содержит и более сложные средства управления вызовом сервисов. В частности, с помощью компонента SplitJoin можно создавать т.н. композитные сервисы. Композитным называется сервис, один вызов которого трансформируется в вызовы множества других сервисов. Такое поведение позволяет, в частности, реализовать паттерн Agregator из каталога Enterprise Integration Patterns. Но это уже - совсем другая история.

Оставайтесь на связи!

Понравилось сообщение - подпишитесь на блог

2 комментария:

Михаил Ештокин комментирует...

Добрый день, спасибо за пост, у меня вот такой вопрос, а в OracleServiceBus для Xquery трансформаций есть возможность импорта функций из других файлов трансформаций

Pavel Samolisov комментирует...

Здравствуйте, сейчас механизм модулей XQuery в OSB не поддерживается, самому их часто не хватает. Возможно поддержку прикрутят в OSB 12c, выпустить которую Oracle обещает до конца года.

Отправить комментарий

Любой Ваш комментарий важен для меня, однако, помните, что действует предмодерация. Давайте уважать друг друга!