Опции трансформации для WebSphere Message Broker V6

После выпуска WebSphere Message Broker V6 увеличился диапазон опций для трансформации сообщений. Эта статья описывает все за и против каждой технологии трансформации, детальную информацию по эксплуатации можно получить в информационном центре.

Энди Пайпер, Senior IT Specialist, IBM

Энди Пайпер (Andy Piper) Старший специалист отдела информационных технологий IBM Software Services по WebSphere в Великобритании. Он работает с клиентами, которым необходима консультация по архитектуре, дизайну и внедрению. У Энди огромный опыт работы с проектами по сервис-ориентированной архитектуре (SOA) на разных платформах. Он был в составе группы специалистов, создавших бета-версию WebSphere Message Broker V6, он разработал и представил систему обучения новым функциям данного продукта. Энди также является соавтором справочника IBM Redbook "Миграция на WebSphere Message Broker V5" и участником разработки IBM SupportPac IC04: WBIMB V5 Change Management and Naming Standards. Вы можете связаться с Энди по адресу andy.piper@uk.ibm.com или через его блог The lost outpost.



19.03.2007

Одна трансформация, разные техники

В статье предполагается, что сообщение необходимо преобразовать из одного XML-формата в другой. IBM®WebSphere®Message Broker V6 предоставляет четыре технологии трансформации:

  • Расширенный язык структурированных запросов (Extended Structured Query Language, ESQL)
  • Языковые трансформации расширяемого языка таблиц стилей (eXtensible Stylesheet Language Transformations, XSLT)
  • Узел графического преобразования (Graphical mapping node)
  • Узел JavaCompute

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

Входной и выходной сигналы, используемые в различных реализациях обработки, представлены ниже:

Рисунок 1. Входящее сообщение

<?xml version="1.0" encoding="UTF-8"?>
<Parent>
 <First>1</First>
 <SaleList>
  <Invoice>
   <Initial>A</Initial>
   <Initial>A</Initial>
   <Surname>Piper</Surname>
   <Item>
    <Code>00</Code>
    <Code>01</Code>
    <Description>Unreal Tournament 2004</Description>
    <Category>Games</Category>
    <Price>24.99</Price>
    <Quantity>01</Quantity>
   </Item>
   <Item>
    <Code>03</Code>
    <Description>XSLT</Description>
    <Category>Books and Media</Category>
    <Price>19.95</Price>
    <Quantity>01</Quantity>
   </Item>
   <Balance>44.94</Balance>
   <Currency>Sterling</Currency>
   </Invoice>
 </SaleList>
 <Last>Test</Last>
</Parent>

Рисунок 2. Исходящее сообщение

<?xml version="1.0" encoding="UTF-8"?>
<Parent>
 <SaleList>
  <Statement Type="Monthly" Style="Full">
   <Customer>
    <Initials>AA</Initials>
    <Name>Piper</Name>
    <Balance>44.94</Balance>
   </Customer>
   <Purchases>
    <Article>
     <Desc>Unreal Tournament 2004</Desc>
     <Cost>39.98</Cost>
     <Qty>01</Qty>
    </Article>
    <Article>
     <Desc>XSLT</Desc>
     <Cost>31.92</Cost>
     <Qty>01</Qty>
    </Article>
   </Purchases>
   <Amount Currency="Sterling">71.9</Amount>
  </Statement>
 </SaleList>
</Parent>

Использование Java™

WebSphere Message Broker V6 представляет новую альтернативу в разработке трансформаций в потоке сообщения. В предыдущих версиях, если Вы хотели использовать Java для работы с сообщением, Вы могли выполнить эту операцию либо путем написания Java-плагина целиком, либо вызывая статичный метод Java из ESQL. Теперь в V6, Вы можете вписать логику трансформации прямо в поток сообщений, используя узел JavaCompute. Многие предприятия выбирают Java в качестве языка разработки, поэтому комбинация известной среды разработки, основанной на Eclipse, например IBM Rational® Application Developer и обладающей способностью использовать Java в разработке потока сообщений, поможет разработчикам, которые ранее не использовали WebSphere Message Broker, начать разработку потока сообщений. Для существующих пользователей WebSphere Message Broker вид и функции узла JavaCompute схож со стандартным узлом Compute, но также позволяет писать собственно Java-код, а не модули ESQL. WebSphere Message Broker V6 предоставляет среду выполнения Java 2 Standard Edition (J2SE) 1.4.2 для Java-кода. На базе J2SE в библиотеках классов представлен широкий диапазон функций, который Вы можете пополнить посредством библиотек сторонних производителей, что делает узел JavaCompute чрезвычайно гибким.

Основы узла JavaCompute

Чтобы вписать Java в Ваш поток сообщения, установите узел JavaCompute в редактор потока сообщения, затем правой кнопкой мыши в узле выберите Open Java (или Open ESQL для стандартного узла Compute). Мастер проведет Вас по пути создания проекта Java и класса для связи с узлом:

  1. Ведите имя для проекта Java.
  2. Ведите имя для класса Java для связи с узлом.
  3. Выберите один из шаблонов для класса (Filtering - фильтрация, Modifying - изменение или Creating message - создание сообщения).

Мастер создаст новый проект и класс Java, а затем автоматически переключится на перспективу Java, и Вы сможете написать код. Или, если код Java уже существует, Вы можете перейти к соответствующему классу, используя опции на странице Properties (свойства) для узла JavaCompute.

Рисунок 3 показывает все шаги создания нового класса Java для узла JavaCompute:

Рисунок 3. Шаги создания проекта узла JavaCompute
Шаги создания проекта узла JavaCompute

Если Вы разработали подключаемые узлы Java для предыдущих версий WebSphere Message Broker, некоторые структуры кода Java в узле JavaCompute покажутся знакомыми – выходные терминалы могут быть выбраны при использовании метода getOutputTerminal класса MbNode, а дерево сообщений может быть доступно при использовании методов класса MbElement. В WebSphere Message Broker V6 Вы также можете управлять деревом сообщений, используя синтаксис XPath.

Потоки JavaComputeTransformXPath и JavaComputeTransformNoXPath из технических образцов JavaCompute показывают, как сообщение на рисунке 1 может быть преобразовано в сообщение на рисунке 2. Поток JavaComputeTransformXPath использует синтаксис XPath, чтобы получить, преобразовать и установить значения на дереве сообщений. JavaComputeTransformNoXPath использует методы MbElement, чтобы управлять деревом. На рисунках 4 и 5 Вы можете сравнить код, который использует XPath, и код, который использует методы MbElement. Обратите внимание на использование расширенного синтаксиса XPath в первом листинге, это показывает, как создать элементы и установить новые значения на дереве сообщений, используя WebSphere Message Broker Java API.

Рисунок 4. Использование XPath для доступа к дереву сообщения

final MbXPath setArticle = 
	new MbXPath("?$Article[?Desc[set-value($item/Description)]]" 
		  + "[?Cost[set-value($item/Price * 1.6)]]"
                   + "[?Qty[set-value($item/Quantity)]]");

Рисунок 5. Использование MbElement для доступа к дереву сообщения

MbElement article = purchases.createElementAsLastChild
(MbElement.TYPE_NAME, "Article", null);
MbElement cursor = item.getFirstElementByPath
("Description");
article.createElementAsLastChild(MbElement.TYPE_NAME,
                                 "Desc",
                                 (String)cursor.getValue());
                                 cursor = cursor.getNextSibling().getNextSibling(); 
                                 // Price element
double cost = Double.parseDouble((String)cursor.getValue()) * 1.6;
cursor = cursor.getNextSibling(); // Quantity element;
int quantity = Integer.parseInt((String)cursor.getValue());
total += cost * quantity;
article.createElementAsLastChild(MbElement.TYPE_NAME, "Cost", Double.toString(cost));
article.createElementAsLastChild(MbElement.TYPE_NAME, "Qty", Integer.toString(quantity));

Когда поток сообщения, содержащий узел JavaCompute, развертывается, все необходимые файлы JAR автоматически упаковываются в архив посредника и распределяются среди посредников. Эта процедура уменьшает расходы на управление в отличие от предыдущих версий, где файлы JAR, содержащие классы Java, вызываемые из ESQL, нужно было вручную переводить в посреднические системы.

Соображения по работе с узлом JavaCompute

У узла JavaCompute есть три выходных терминала -- out, alternate и failure -- которые позволяют провести маршрутизацию посредством терминалов out или alternate. Эта процедура не такая гибкая, как все узлы, которые используют ESQL для обработки. И у узла Filter, и улучшенного узла WebSphere Message Broker V6 Compute есть больше трех выходных терминалов. Если Вы используете Java, и Вам требуется больше трех выходных терминалов, Вам необходим полный подключаемый узел Java. Из-за сходства в структуре кода, необходимого для узла JavaCompute и Java-плагина, легче создать новый подключаемый узел Java, основанный на коде, предварительно разработанном для узла JavaCompute. Это поставит команды на новый уровень вторичного использования, так как функция предварительной заготовки в форме нового подключаемого узла может быть добавлена к панели разработчика потока сообщения.

Если узлу JavaCompute нужно сообщение с базой данных, существуют три пути:

  1. Класс MbSQLStatement, который является частью Java API, характерной для WebSphere Message Broker, и предоставляет узлу доступ к любому ресурсу данных ODBC, к которому может подключиться WebSphere Message Broker. Эта процедура предоставляет полную поддержку транзакций между базой данных и другими восстановимыми ресурсами, которые поддерживают протокол XA, например WebSphere MQ.
  2. JDBC-соединение, тип 2 или тип 4. В этом случае WebSphere Message Broker не способен предоставить полную поддержку транзакций для операций с базами данных.
  3. SQLJ. Новая возможность в WebSphere Message Broker V6 Fix Pack 1. В этом случае WebSphere Message Broker не способен предоставить полную поддержку транзакций для операций с базами данных.

Преимущества узла JavaCompute

Java может быть языком, выбранным для производства или предпочтительным вариантом в целях производительности. Ключевое преимущество узла JavaCompute – это широкий диапазон функций, доступных в базовых классах Java. Кроме того, в Интернете доступно множество разнообразных библиотек классов сторонних производителей. Возможно, предприятие уже разработало библиотеки классов Java, которые выполняют основные функции в бизнесе. WebSphere Message Broker V6 поставляется с несколькими образцами потоков сообщения, которые показывают, как использовать различные библиотеки классов. Например, один образец потока показывает основные преобразования сообщения, другой показывает, как использовать узел JavaCompute, чтобы вызвать Google API. Еще один образец показывает, как использовать JavaMail NNTP (newsgroup) API. Некоторые простые алгоритмы, как кодирование Base64 и MD5SUM нужно будет писать вручную в ESQL, но они уже доступны в Java. Это прекрасная возможность использовать существующий код.

Если узел JavaCompute разворачивать в WebSphere Message Broker V6 на z/OS, тогда любая работа с узлом может быть упрощена с помощью zSeries Application Assist Processor (zAAP), который помогает снизить стоимость и является безусловным преимуществом использования поддержки Java в WebSphere Message Broker V6.

Для получения более подробной информации по использованию узла JavaCompute, обратитесь к ресурсу Использование Java в WebSphere Message Broker V6.

Основные преимущества узла JavaCompute

  • Среда выполнения J2SE 1.4.2
  • Знакомый интерфейс для разработчиков Java
  • Широкий выбор доступных библиотек классов
  • Возможность оперировать с любым сообщением MRM или XML, используя MbXPath или MbElement API
  • Возможность освобождения от излишней загрузки за счёт zAAP на z/OS
  • Доступная координация транзакций с базами данных при использовании MbSQLStatement (но не при использовании JDBC или SQLJ).

Использование языковых трансформаций eXtensible Stylesheet Language Transformations (XSLT)

Если компания использует XML для хранения данных, XSLT может стать языком, выбранным для трансформации между форматами. Многие трансформации XSL возможно уже существуют, но, используя этот язык, разработчик может создать трансформации сам. XSLT также может стать хорошей альтернативой, если Вам нужно произвести одинаковые трансформации с разными продуктами, так как несколько различных движков могут применить эти трансформации к данным XML. Таблицы стилей, разработанные для использования в других движках, например WebSphere Application Server или Web-браузер Mozilla Firefox, могут быть использованы повторно без изменений в WebSphere Message Broker.

Основы XSLT

XSLT - это язык стандарта W3C на основе XML для трансформации данных XML. Трансформация обычно производится из одного документа XML в другой, но конечный результат не обязательно будет в XML. Для доступа к элементам внутри дерева сообщения и работе с ними XSLT основывается на XPath. WebSphere Message Broker поддерживает использование таблицы стилей, соответствующих XSLT 1.0 через использование движка XALAN-4J.

Использование XSLT с WebSphere Message Broker V6

Чтобы использовать XSLT в потоке сообщения, нужно выполнить две операции:

  1. Создайте файл таблицы стилей (.xsl).
  2. Задайте конфигурацию потоку сообщения для трансформации.

Если таблица стилей не существует, у инструментария WebSphere Message Broker (основанного на Rational Application Developer) есть несколько способов работы с файлами XML, которые позволяют ее построить. Эти способы включают в себя редактор и отладчик трансформаций XSL.

По умолчанию, создавая новое рабочее пространство в WebSphere Message Broker Toolkit, эти новые свойства XML не доступны. Чтобы получить доступ к этим свойствам, необходимо включить соответствующую функцию, выбрав Preferences => Workbench => Capabilities:

Рисунок 6. Доступ к новым свойствам XML в инструментарии WebSphere Message Broker
Доступ к новым свойствам XML в инструментарии WebSphere Message Broker

Например, если у Вас остались таблицы стилей от предыдущих проектов, Вы можете разработать или отладить Ваши таблицы стилей с помощью другого продукта. Тогда Вам просто нужно внести таблицы стилей в Ваше пространство инструментарии WebSphere Message Broker, когда Вы будете готовы использовать их. Подробную информацию по созданию и разработке таблиц стилей см. в информационном центре WebSphere Message Broker.

Таблицы стилей, используемые для трансформации между нашими входными и выходными типами сообщений, показаны на рисунке 7. Таблица стилей включена в проект XMLT Sample Message Flows и как образец технологии XMLT поставляется с WebSphere Message Broker V6:

Рисунок 7. XSLT для трансформации сообщений

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:template match="/">
 <Parent>
  <xsl:for-each select="/Parent/SaleList">
   <SaleList>
   <xsl:for-each select="Invoice">
    <xsl:if test="not(contains(Surname,'Shop'))">
     <Statement>
      <xsl:attribute name="Type">Monthly</xsl:attribute>
      <xsl:attribute name="Style">Full</xsl:attribute>
      <Customer>
       <Initials>
        <xsl:for-each select="Initial">
         <xsl:value-of select="."/>
        </xsl:for-each>
       </Initials>
       <Name><xsl:value-of select="Surname"/></Name>
       <Balance><xsl:value-of select="Balance"/></Balance>
      </Customer>
      <Purchases>
       <xsl:for-each select="Item">
       
        <Article>
         <Desc><xsl:value-of select="Description"/></Desc>
         <Cost><xsl:value-of select='format-number((number(Price)*1.6),
         "####.##")'/></Cost>
         <Qty><xsl:value-of select="Quantity"/></Qty>
        </Article>
       
       </xsl:for-each>
      </Purchases>
      <Amount>
       <xsl:attribute name="Currency">
        <xsl:value-of select="Currency" />
       </xsl:attribute>
       <xsl:call-template name="sumSales">
        <xsl:with-param name="list" select="Item"/>
       </xsl:call-template> 
      </Amount>
     </Statement>        
    </xsl:if>
   </xsl:for-each>
   </SaleList>
  </xsl:for-each>
 </Parent>
 </xsl:template>
 
 <xsl:template name="sumSales">
  <xsl:param name="list" />
  <xsl:param name="result"  select="0"/>

  <xsl:choose>
   <xsl:when test="$list">
    <xsl:call-template name="sumSales">
     <xsl:with-param name="list"
      select="$list[position()!=1]"/>
     <xsl:with-param name="result" 
      select="$result + number($list[1]/Price)*number($list[1]/Quantity)*1.6"/>
    </xsl:call-template>
   </xsl:when>
   <xsl:otherwise>
    <xsl:value-of select='format-number(number($result),"####.##")'/>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

Чтобы производить трансформацию XSL в потоке сообщения, используйте узел XMLTransformation, как показано на рисунке 8. Поток сообщения XMLT_Sample_Flow входящий в комплект образцов технологии XMLT, показывает использование узла, а таблица стилей трансформирует входящее сообщение, как на рисунке 1, в исходящее сообщение, как на рисунке 2.

Рисунок 8. Работа с потоком сообщения в XSLT
Работа с потоком сообщения в XSLT

Об XSLT

Узел XMLTransformation зависит от сообщения, которое поступает на узел и содержит данные в формате XML, так как XSLT работает только с данными, определенными как XML. Это не означает, что сообщение должно быть в одном из доменов XML, но поток двоичных данных должен содержать правильный XML. Это ограничение не применимо к выходным данным, так как XSLT может создать выходные данные в разных форматах. Сообщение, доставленное на выходной терминал узла XMLTransformation, будет содержаться в домене BLOB. Если выходные данные - XML и требуется дальнейшая обработка в потоке сообщения, домен сообщения должен быть переустановлен в XML, XMLNS или XMLNSC после того, как покинет узел XMLTransformation, например, используя узел ResetContentDescriptor.

На странице свойств (Properties page) для узла, Вы можете определить, какую таблицу стилей использовать, когда сообщение проходит через узел. Имя и место нахождения таблицы стилей могут быть прикреплены к документу XML при прохождении через узел, в этом случае может быть использована опция XML Embedded Selection. Или Вы можете выбрать уже существующую таблицу стилей из Вашего рабочего пространства. Таблица стилей будет автоматически применена к посреднику внутри архивного файла посредника. Обратите внимание, что таблица стилей должна быть расположена локально по отношению к системе посредника – невозможно указать удаленный URI как место расположения таблицы стилей.

Узел XMLTransformation использует движок XALAN-4J и является подключаемым узлом Java. Одно из преимуществ этого является тот факт, что, как и с узлом JavaCompute, на платформе z/OS обработка может быть передана процессору zAAP. Другим преимуществом является то, что готовые таблицы стилей поддерживаются на всех платформах, улучшая работу по сравнению с предыдущей версией. Для улучшения работы таблицы стилей, считываемые с диска, остаются в памяти – узел не кэширует таблицы стилей, которые содержатся во входящем сообщении.

Узел XMLTransformation – это Java-плагин, поэтому невозможно использовать отладчик, чтобы попасть в таблицу стилей, пока она применяется к потоку сообщений. Вы можете использовать или XSL-отладчик в инструментарии WebSphere Message Broker, чтобы отладить таблицу стилей вне потока сообщения, или трассировку, чтобы установить, в чём состоит проблема. Когда заданы параметры узла для детальной трассировки, информация об обработке сообщений через узел пишется в отдельный файл, а не в файл стандартной трассировки пользователя, что отделяет информацию о потенциальных проблемах с таблицей стилей. Для получения подробной информации обратитесь в информационный центр WebSphere Message Broker.

При использовании узла XMLTransformation невозможно получить доступ к заголовкам сообщения, которые соотносятся с входящим сообщением. Получить доступ и внести изменения с помощью логики XSLT можно только в сообщение в XML.

Основные преимущества XSLT

  • Вторичное использование существующей логики XSLT, или возможность создания новой логики XSLT для вторичного использования
  • Доступные улучшенные возможности обработки XML в инструментарии Message Broker
  • Возможность передачи нагрузки zAAP на z/OS
  • Входящие данные должны быть в формате XML; форматы выходных данных могут варьироваться
  • Использование отладчика XSL или опции node detailed trace для отладки трансформаций

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

Узел преобразований обеспечивает графический способ выполнения преобразований между полями во входящем сообщении или базе данных и одним или более исходящим сообщением или таблицами базы данных. Цель – упростить программирование и позволить разработчикам быстро трансформировать структуры сообщений из одной в другую.

Начало работы с узлом преобразований (mapping node)

Чтобы использовать узел Mapping, входящие и исходящие структуры должны быть заданы WebSphere Message Broker Toolkit. В случае с таблицей базы данных, эта операция может быть в форме схемы базы данных; а в случае с сообщением, это будет Message Set (набор сообщений) и Message Definition File (файл определения сообщения). Изначально в наших образцах не было заданных сообщений или схем XML, но Вы можете создать схему, выбрав правой кнопкой мыши файл XML в Message Brokers Toolkit и выбрав Generate => XML Schema. Как только схемы созданы, их можно импортировать в проект Message Set для создания требуемых определений сообщений.

Чтобы начать преобразование, поместите узел Mapping в поток сообщения. Правой кнопкой мыши выберите в узле Open Map Мастер поможет Вам поэтапно создать новый файл преобразования сообщения. Этапы мастера:

  1. Выберите имя файла
  2. Выберите часть сообщения для преобразования (заголовок или весь текст, или только текст)
  3. Выберите преобразование сообщения, базы данных, или того и другого
  4. Выберите исходное и целевое сообщения

Когда файл преобразования инициализирован, открывается редактор преобразования (mapping editor). Редактор преобразования показан на рисунке 9. Верхняя половина редактора позволяет перетащить элементы из исходного сообщения (1) в целевое (2), чтобы создать связь между полями, которые отмечены связывающими их линиями. Скрипт преобразования (3) графически отображается в нижней части редактора. В центральной секции редактора можно работать с индивидуальными формулами с использованием синтаксиса XPath.

Как на изображенном примере, значения всех полей Price в исходном сообщении суммируются и умножаются на 1,6, чтобы получить результат, показанный в поле Amount в исходном сообщении.

Рисунок 9. Редактор преобразования
Редактор преобразования

Обратите внимание, что ссылки на поля сообщений даются с использованием синтаксиса XPath. Вы также можете применить такие функции XPath в узле mapping, как fn:concat, fn:count и fn:substring. Подробную информацию можно получить в информационном центре WebSphere Message Broker и в технических образцах Message Mapping. Пример также показывает цикл for loop в преобразовании – для каждого Parent/SaleList/Invoice/Item в исходном сообщении, элемент Article создается в целевом сообщении с помощью подэлементов Desc, Cost, Qty, преобразованных из исходного сообщения. Этот повторяющийся стиль преобразования может быть очень эффективным.

Примерный сценарий при использовании преобразований

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

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

Например, используя редактор преобразования, невозможно суммировать несколько полей целевого сообщения. В примере, поле Statement/Amount в целевом сообщении – это результат сложения всех полей Statement/Purchases/Article/Cost целевого сообщения, которые являются результатом умножения поля Price из исходного сообщения. Так как невозможно суммировать целевые поля в другое целевое поле, нужно прибавить и умножить исходные поля Price на целевое поле Amount. Выражение XPath выглядит следующим образом:

fn:sum($source/Parent/SaleList/Invoice/Item/Price) * 1.6

Чтобы объединить все поля Initial из исходного сообщения в единое поле Initials в целевом сообщении, также нельзя использовать ни редактор преобразования, ни функцию XPath. В этом случае можно расширить узел преобразования, используя функции ESQL. Функция ESQL вызывается из карты при использовании синтаксиса esql:<broker_schema>.<function_name>. В нашем примере, мы можем вызвать функцию ESQL, необходимую для данной операции, используя следующее выражение:

esql:map.ConcatenateInitials($source/Parent/SaleList/Invoice)

Функция ConcatenateInitials существует внутри схемы посредника, которая называется map. Она принимает ссылку REFERENCE, которая указывает на дерево Parent/SaleList/Invoice в исходном сообщении. Затем она повторяется через все экземпляры элемента, под названием Initial и объединяет их в переменную CHARACTER, которая возвращается в map.

CREATE FUNCTION ConcatenateInitials (invoice REFERENCE "Invoice" ) RETURNS CHARACTER
BEGIN
	DECLARE ref REFERENCE TO invoice.Initial[1];
	DECLARE result CHARACTER '';
	WHILE LASTMOVE(ref) DO
		SET result = result || ref;
		MOVE ref NEXTSIBLING REPEAT NAME;
	END WHILE; 
	RETURN result;
END;

Эта способность самого узла использовать ESQL, чтобы расширить преобразования больше, чем это было возможно при помощи функций XPath, делает узел преобразования гибким инструментом трансформации.

Основные преимущества ESQL

  • Доступный графический интерфейс
  • Подходит даже начинающим разработчикам Java или ESQL
  • Быстрые результаты за период разработки
  • Входящие и исходящие сообщения должны быть определены Message Set (или схемой базы данных)
  • Не так много функций, как у Java или ESQL

Использование Расширенного языка структурированных запросов (ESQL)

Пользователи WebSphere Message Broker обычно используют ESQL для трансформаций. Этот язык существует со времен версии 2.0 MQSeries Integrator (первое название WebSphere Message Broker). Со временем возможности ESQL были расширены и улучшены. В 6 версии язык был усовершенствован:

  • Встроенная кэш-память, позволяющая улучшать производительность без чтения баз данных для трассировки и валидации
  • Улучшенная поддержка результатов, возвращенных хранимыми процедурами базы данных
  • Улучшенная поддержка DATETIME
  • Возможность доступа ко многим базам данных внутри одного узла Compute
  • Доступ к информации среды посредника
  • Улучшенная обработка ошибок с помощью обработчиков SQL

Кроме того, стандартный узел Compute предоставляет 5 терминалов вывода, что обеспечивает гибкость трассировки внутри потока сообщения.

Примерный сценарий при использовании ESQL

Код ESQL, необходимый для выбранной трансформации, показан ниже. Чтобы следить за такими повторяющимися элементами, как Statement или Item, нужно проделать определенную работу, поэтому используются индексы массива.

Рисунок 10. ESQL для трансформации сообщения

DECLARE total FLOAT;
DECLARE count INTEGER 1;
DECLARE innercount INTEGER 1;
DECLARE i INTEGER 1;
DECLARE saleListRef REFERENCE TO InputBody.Parent.SaleList[1];
CREATE FIELD OutputRoot.XML.Parent;   
DECLARE outref REFERENCE TO OutputRoot.XML.Parent; 

WHILE LASTMOVE(saleListRef) DO
	DECLARE invoiceRef REFERENCE TO saleListRef.Invoice[1];
	WHILE LASTMOVE(invoiceRef) DO
           IF (invoiceRef.Surname <> 'Shop') THEN     
               SET outref.SaleList[i].Statement[count].
               Customer.Initials = invoiceRef.Initial[1] 
               || COALESCE(invoiceRef.Initial[2],'');     
               SET outref.SaleList[i].Statement[count].
               Customer.Name = invoiceRef.Surname;     
               SET outref.SaleList[i].Statement[count].
               Customer.Balance = invoiceRef.Balance;           
               DECLARE ref2 REFERENCE to invoiceRef.Item[1];   
               SET total = 0;     
               SET innercount = 1;           
               WHILE (LASTMOVE(ref2) = TRUE) DO     
               	IF (ref2.Price > 0.0) THEN       
                 	SET outref.SaleList[i].Statement[count].
                 	Purchases.Article[innercount].
                 	Desc =        ref2.Description;       
                        SET outref.SaleList[i].Statement[count].
                        Purchases.Article[innercount].
                        Cost =        CAST(ref2.Price AS FLOAT) * 1.6;       
                        SET outref.SaleList[i].Statement[count].
                        Purchases.Article[innercount].
                        Qty =        ref2.Quantity;       
                        SET total = total + (CAST(ref2.Price AS FLOAT) * CAST
                        (ref2.Quantity AS FLOAT) * 1.6);             
                        SET innercount = innercount + 1;             
                  END IF;                     
               MOVE ref2 NEXTSIBLING REPEAT NAME;           
               END WHILE;             
          	SET outref.SaleList[i].Statement[count].Amount = total;     
                SET outref.SaleList[i].Statement[count].Amount.
                Currency = invoiceRef.Currency;     
                SET outref.SaleList[i].Statement[count].Type ='Monthly';     
                SET outref.SaleList[i].Statement[count].Style = 'Full';     
                SET count = count + 1;       
             END IF; 
             MOVE invoiceRef NEXTSIBLING NAME 'Invoice'; 
	END WHILE;
	SET i = i + 1;
	SET count = 1;
	MOVE saleListRef NEXTSIBLING NAME 'SaleList';
END WHILE;

Преимущества использования ESQL

ESQL – это интерпретируемый язык, исполняемый WebSphere Message Broker V6 runtime.

SQL хорошо известен, и перейти с SQL на ESQL можно относительно быстро, поэтому, если в Вашей организации нет специалистов по Java, тогда выбирайте ESQL. Если Вы мигрируете с раннего выпуска WebSphere Message Broker, тогда Вам возможно знаком ESQL. Потоки сообщений в Вашей оперативной памяти уже запрограммированы с помощью ESQL, нет смысла отказываться от ESQL, хотя при желании Вы можете добавить к Вашим потокам другие технологии трансформации.

У ESQL сильный потенциал вторичного использования, так как Вы можете строить библиотеки кодов вне функций и процедур ESQL, хранить их в схемах, аналогичных пакету Java. Эти основные функции могут многократно использовать другие команды или проекты.

Так как ESQL происходит от SQL, его применяют для оперирования данными сообщений в случае широкого взаимодействия с базой данных. WebSphere Message Broker V6 может производить транзактные координатные трансформации при работе базы данных внутри потока сообщения. Вы можете использовать стандартные операторы SQL SELECT как для данных сообщения, так и для таблиц базы данных. Некоторые организации кодируют бизнес-логику в SQL от старых приложений баз данных, и иногда эта логика может быть использована вторично путем перевода ее в ESQL. Вы также можете напрямую вызвать внешние хранимые процедуры из ESQL и при необходимости обработать результаты.

В WebSphere Message Broker V6 Вы можете писать в системный журнал регистрации событий прямо из ESQL. Эта функциональность доступна только в ESQL или из Java API, но не в XSLT или преобразовании, и поэтому, если Вам это нужно, ESQL является наилучшим вариантом для частей потока сообщения там, где необходимо.

Если требуемая функция недоступна в ESQL, Вы можете написать класс Java, который использует статический метод. Поэтому ESQL очень гибок, имеет способность взаимодействовать непосредственно с базами данных, вызывает хранимые процедуры, методы Java, и управляет данными сообщения в любом домене, поддерживаемом Message Broker V6.

Основные преимущества ESQL

  • Знаком пользователям и сильно усовершенствован в V6
  • Хорош для работы с базами данных, имеет синтаксис, похожий на SQL
  • Доступ ко всем доменам сообщений
  • Использует соединение Message Broker V6 ODBC для связи с базами данных, а не JDBC
  • При необходимости может вызвать статические методы Java
  • Наилучшая производительность

Вопросы производительности, эффективности и стоимости

Среди вопросов по производительности, эффективности и стоимости – повторное использование ресурсов, скорость и затраты на разработку и производительность при работе. Возможность повторного использования ресурсов, например, расширяемой таблицы стилей, может снизить затраты на разработку, но в то же время повлиять на производительность, в зависимости от типа и сложности используемых процессов, так как производительность расширяемой таблицы стилей обычно ниже, чем у запрограммированной вручную реализации в ESQL или Java. Если важна прежде всего пропускная способность потока сообщений, ESQL или Java больше подойдут Вам для логики обработки.

Дополнительные опции

Другие способы работы с данными сообщений в WebSphere Message Broker включают написание подключаемых узлов с помощью языка C или вызов хранимых процедур баз данных, передачу значений от дерева сообщений и получение одного и более значений обратно от движка СУБД. Для получения более подробной информации обратитесь в информационный центр WebSphere Message Broker.

Заключение

Эта статья описывает четыре основные технологии трансформации данных в WebSphere Message Broker, которые покрывают множество языков программирования и стилей разработки от кодирования до преобразования при помощи графического интерфейса. Эта статья также дает подробную информацию о преимуществах и недостатках каждого варианта и объясняет, как Вы должны рассматривать функциональные и нефункциональные требования, чтобы выбрать лучшую технологию для данного сценария интеграции. Другие факторы, влияющие на выбор технологии трансформации, включают язык программирования, используемый в Вашей компании и навыки разработчиков потока сообщений. Помните, что Вы можете использовать разные подходы к технологиям в разных проектах, внутри одного проекта и внутри одного потока сообщений. Широкий выбор опций трансформации и возможность комбинировать их позволяют назвать WebSphere Message Broker V6 действительно гибким решением среди продвинутых корпоративных сервисных шин (advanced enterprise service bus).

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=WebSphere
ArticleID=202606
ArticleTitle=Опции трансформации для WebSphere Message Broker V6
publish-date=03192007