程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> WebSphere >> WebSphere Message Broker V8 中 Mapping 節點簡介

WebSphere Message Broker V8 中 Mapping 節點簡介

編輯:WebSphere

引言

IBM WebSphere Message Broker V8(以下簡稱為 Message Broker)是 IBM 在企業服務總線(Enterprise Service Bus, ESB)領域裡的關鍵產品,它采用總線結構將所有的應用系統互聯在一起,應用系統以服務的方式插入到總線上,或者由總線封裝成服務。

Message Broker 的一個關鍵的功能就是協議的轉換,在 Message Broker V8 版本中提供了六種轉換節點,分別是 ESQL 計算節點(Compute)、Java 計算節點(JavaCompute)、.Net 計算節點(.NETCompute)、PHP 計算節點 (PHPCompute) 、XSL 轉換節點 (XSL Transform) 和 Mapping 節點 (Mapping) 。相對於以前的版本,.Net 計算節點是新引入的轉換節點,旨在為在 .Net 平台上開發的用戶提供支持; Mapping 節點提供了非常多的改進,我們會在本文中詳細介紹。

本文的主要目的就是介紹 Message Broker V8 中新改進的 Mapping 節點的諸多功能,並通過一個實例詳細介紹如何使用 Mapping 節點中的結構(structural)轉換功能。

Message Broker V8 中的 Mapping 節點

Mapping 節點全稱為 IBM Graphical Data Mapper (GDM) ,是一種圖形化的數據映射工具。實際上它在 V8 之前的版本中已經存在並廣泛應用,它在 V8 中主要有以下三個方面的提高:

易用性的提高:使用了更加簡潔的界面,更加容易的創建簡單或者復雜的轉換功能。

支持廣度的提高:使用了 IBM 產品模塊化技術,能夠在 IBM 多個產品中通用,使用戶的學習成本大幅減低。並且實現了對 XPath 2.0 腳本語言的支持,也就是說我們在 Mapping 節點裡可以使用 XPath2.0 裡提供的新的函數,效率也更加的高效。

性能的提高:采用的新的運行時引擎,這也是 Mapping 節點的最大的改進。它采用 Mapping Specification Language (MSL) 格式的匯編語言,使執行效率得到了較大幅度的提高。

在 Message Broker V8 中可以使用之前版本中創建的 Mapping 節點,在 V8.0.0.1 中更實現了 Mapping 文件的協助轉換功能。對於用戶不想升級的 Mapping 節點,在 V8 中還可以正常的使用;如果用戶想要利用更加先進的引擎並提高執行效率,原有的 Mapping 文件(.msgmap)可以被協助轉換為 Message Broker V8 中的新的 Mapping 文件 (.map) 。

Message Map 支持的消息模型

在 Message Broker V8 中可以支持以下三種類型:

XSD Schema, XSD schema 是 W3C(World Wide Web Consortium)國際通用標准支持的,用於描述 XML 文檔結構的一種語言。

DFDL Schema,DFDL(Data Format Description Language)是在 Message Broker V8 中引進的新的消息模型,它基於 XML Schema 1.0 標准。在 V8 之前的版本中,對於文本和二進制數據,主要使用 MRM 消息集,在 V8 中采用了業界通用的標准 DFDL,Mapping 節點也對 DFDL 有著很好的支持。

消息集(Message Sets),消息集是 Message Broker V8 之前版本中消息模型的原始容器。在 V8 以及以後的版本中,消息模型都會包含在應用程序或者庫中。但是 Mapping 節點仍然支持消息集的使用。

Mapping 編輯器中的轉換類型

在 Mapping 編輯器中可以將輸入和輸出對象的元素和屬性進行匹配。Mapping 編輯器中轉換類型主要分為三大類:核心轉換功能、數據庫相關轉換和結構化(structural)的轉換。如圖一所示: 這是 Mapping 編輯器中所有的轉換功能分類匯總:

圖 1. 轉換功能分類匯總

核心功能轉換(Core Mapping Transform): 這主要包括了絕大部分轉換功能,包括了復制(Move)、賦值(Assign)、類型轉換(Convert)、使用內嵌函數轉換(XPath)、外部語言的調用(Custom Java、Custom ESQL、Custom XPath)等等,這些都是一些基本的操作,這裡就不再詳細的介紹,大家可以在參考資料中的找到相關章節。

數據庫相關轉換(Database Transform):這包括跟數據庫打交道的相關部分,比如插入數據(Insert)、刪除數據(Delete)、更改數據(Update)、查詢數據(Select)以及對異常的處理(Failure)等等。

結構化轉換(Structural Mapping Transforms):這部分主要是針對更復雜的嵌套元素的轉換,比如數組轉換(ForEach)、多對一轉換(Append & Join)以及嵌套轉換(Local Map)等等。

Mapping 節點對於消息頭的轉換

當我們創建一個 Mapping 節點,默認情況下,只有 Properties 頭和消息體顯示在 Mapping 節點編輯器中,所有其他的頭(Header)都會直接拷貝到輸出中,並不會發生任何改變。對於 LocalEnvironment、 ExceptionList 和 Environment 也不會發生任何改變的傳輸到輸出中。如果用戶想要改變除 Properties 以外的消息頭,就需要手動將其添加到 mapping 節點中,如下圖 2 所示:

圖 2. 添加需要轉換的消息頭

查看本欄目

運行時的 Log 信息

Message Broker 的用戶記錄(user trace)將會記錄消息經過 Mapping 節點的相關信息。這些 Log 信息將在如下的情況被記錄於 user trace 中:

當進入或者離開轉換功能節點時,比如進入或者離開 Move 轉換時,會有相關的 log 信息。

當輸入的消息樹被轉換到輸出節點時

當輸出的消息元素被創建時

當消息元素被賦值(Assign)時

當外部函數被調用的時候

在接下來的業務實例中,我們將重點關注多對一轉換中 Append 的使用,這裡的多對一是指將多個輸入元素轉換到一個單一的數組中。實例中將會涉及到包括 Local map、Append、For Each、Assign 和 Move 的轉換使用。

業務實例

在這個業務實例裡,我將利用 Mapping 節點,從一個學校裡的各個興趣小組中提取學生成員,並轉換為一個包含所有學生的數組。為了使業務實例看起來簡單易懂,我只創建了一個簡單的消息流,這個消息流只包括三個節點:一個 MQInput 節點從 MQ 隊列裡讀取數據,一個 Mapping 節點做轉換功能和一個 MQOutput 節點將數據輸出到 MQ 隊列中去。

輸入輸出的文件介紹

輸入 XML 文件描述的是學校中興趣小組裡學生的信息:興趣小組包括閱讀小組和體育小組;學生的信息包括姓名和年齡。如清單一所示,閱讀小組裡有兩個學生,體育小組裡有三個學生。

清單 1. 輸入 XML 文件
<?xml version="1.0" encoding="UTF-8"?> 
<tns:Group xmlns:tns="http://www.example.org/Group"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<tns:read> 
<tns:student> 
<tns:name>student1</tns:name> 
<tns:age>10</tns:age> 
</tns:student> 
<tns:student> 
<tns:name>student2</tns:name> 
<tns:age>11</tns:age> 
</tns:student> 
</tns:read> 
<tns:sport> 
<tns:student> 
<tns:name>student3</tns:name> 
<tns:age>10</tns:age> 
</tns:student> 
<tns:student> 
<tns:name>student4</tns:name> 
<tns:age>11</tns:age> 
</tns:student> 
<tns:student> 
<tns:name>student5</tns:name> 
<tns:age>11</tns:age> 
</tns:student> 
</tns:sport> 
</tns:Group>

輸出文件將統計所有學生的信息,也就是所要將所有興趣小組裡的學生信息提取匯總,形成一個新的學生數組,如清單二所示,共有五個學生,其中兩個學生的興趣小組為閱讀,三個學生的興趣小組為體育。

清單 2. 輸出 XML 文件

<?xml version="1.0" encoding="UTF-8"?> 
<out:Class xmlns:out="http://www.example.org/class"> 
<out:student> 
 <out:name>student1</out:name> 
 <out:age>10</out:age> 
 <group>Read</group> 
</out:student> 
<out:student> 
 <out:name>student2</out:name> 
 <out:age>11</out:age> 
 <group>Read</group> 
</out:student> 
<out:student> 
 <out:name>student3</out:name> 
 <out:age>10</out:age> 
 <group>Sport</group> 
</out:student> 
<out:student> 
 <out:name>student4</out:name> 
 <out:age>11</out:age> 
 <group>Sport</group> 
</out:student> 
<out:student> 
 <out:name>student5</out:name> 
 <out:age>11</out:age> 
 <group>Sport</group> 
</out:student> 
</out:Class>

查看本欄目

Message Broker 中創建消息模型

在我們了解了業務實例的相關背景之後,我們就要在 Message Broker V8 工具集中創建我們要實現的應用程序(TestMappingAppend)。由於創建應用程序不是本文的重點,讀者如果對這部分不是非常熟悉的話,可以閱讀本文的參考資料去學習如何創建應用程序。

創建完應用程序之後,我們將輸入和輸出的文件導入我們的應用程序中,然後創建對應輸入輸出消息的模型,這是 Message Broker V8 中新加入的功能,下面我們將展示如何創建消息模型。

首先我們要打開 Message Broker 工具集:

新建一個應用程序(TestMappingAppend)

右鍵點擊新建的應用程序(TestMappingAppend),New -> MessageModel

在彈出的窗口中選中 Other XML,點擊 Next

在彈出的窗口中選擇 Create an XML schema file using an XML document as an example,點擊 Next

選中 group.xml, 如下圖 3 所示

圖 3. 新建消息模型

創建完成消息模型之後,最終生成的 XSD 文件,我們需要打開 XSD 文件,並設定好對應關系,比如興趣小組裡可以包含至多一個閱讀組和一個體育組;一個閱讀組裡可以包含多個學生,一個體育組裡也可以包含多個學生。修改完成之後的消息模型文件如下:

清單 3. 輸入 XML 的消息模型文件

點擊查看代碼清單

同樣的,我們也創建輸出消息的消息模型,清單如下:

清單 4. 輸出 XML 的消息模型文件
<?xml version="1.0" encoding="UTF-8"?><xsd:schema
targetNamespace="http://www.example.org/class"
 xmlns:tns="http://www.example.org/class" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
 <xsd:element name="Class"> 
   <xsd:complexType> 
     <xsd:sequence> 
       <xsd:element maxOccurs="unbounded" ref="tns:student" minOccurs="1" /> 
     </xsd:sequence> 
   </xsd:complexType> 
 </xsd:element> 
 <xsd:element name="name" type="xsd:string" /> 
 <xsd:element name="student"> 
   <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element ref="tns:name" maxOccurs="1" minOccurs="1"  /> 
     <xsd:element ref="tns:age" maxOccurs="1" minOccurs="1"  /> 
     <xsd:element name="group" type="xsd:string" maxOccurs="1"
     minOccurs="0"></xsd:element> 
     </xsd:sequence> 
   </xsd:complexType> 
 </xsd:element> 
 <xsd:element name="age" type="xsd:int" /> 
</xsd:schema>

消息流中創建 Mapping 節點

在創建了輸入輸出的消息模型之後,我們要新建一個如下圖 4 的消息流 GetAllStudentsFlow,這裡要把消息流輸入節點的 Message Domain 設定為 XMLNSC 解析器。

圖 4. 新建消息流

點擊新創建消息流中的 Mapping 節點,一下為詳細步驟:

雙擊消息流中的 Mapping節點

彈出的對話窗中使用默認的名字 GetAllStudentsFlow_Mapping, 點擊 Next

選擇輸入 Schema 為 Group,輸出 Schema 為 Class,點擊 Next

選擇輸出 domain 為 XMLNSC,並點擊 Finish

查看本欄目

配置 Mapping 節點

在 Mapping 節點編輯器中,將 Group 和 Class 進行匹配,使用 Local map 轉換,如下圖 5 所示:

圖 5. Local Map 的使用

雙擊 Local Map,在新出現的編輯器中使用 Append 轉換,Append 轉換可以連接多個輸入,合並為一個輸出數組。在這裡就是講閱讀組和體育組中的同學都合並匯總到學生數組中, 如下圖 6 所示:

圖 6. Append 的使用

雙擊 Append,在新的編輯器中,點擊 For Each,在新編輯器中將匹配項相連,將對興趣小組賦值,如下圖 7 所示

圖 7. Move 和 Assign 的使用

現在,我們新建的 Mapping 節點就已經完全建好了,我們可以將多個輸入(閱讀組和體育組)轉換為一個輸出數組(班級所有學生列表)。下面我們將部署我們的消息流應用程序,查看相關的結果。

部署並查看結果

在工具集中我們將應用程序直接拖拽部署到 Message Broker 中,並在 Message Broker 的隊列中創建兩個用於輸入和輸出的隊列(In 和 Out),部署成功之後我們就可以查看結果了。

我們可以利用工具 RFHUtil 往輸入隊列 In 中發送清單 1 中所示的消息,然後使用該工具查看輸出隊列 Out 中所接收到的信息,如下圖 8 所示:

圖 8.查看輸出隊列 Out 中所接收到的信息

總結

至此為止,介紹了 Message Broker V8 中 Mapping 節點的新特性,並用一個業務實例演示了如何使用 Append 將多個輸入信息轉換為一個輸出數組。 希望讀者通過本文能對 Message Broker 的 Mapping 節點有個更加深入的了解。

下載

描述 名字 大小   TestMappingAppend.zip   4kb
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved