IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Information Management  >

DB2 MQ XML 函数: 从 DB2 应用程序使用 MQSeries 和 XML Extender

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

Morgan TongIBM
Dan WolfsonIBM

2002 年 6 月 01 日

本文使用示例和样本代码来说明如何一起使用 MQSeries 和 DB2 XML Extender 来创建将 XML 消息传递与数据库访问相结合的应用程序,以启用各种各样的电子商务应用程序。通过将 MQSeries 和 WebSphere MQIntegrator 中功能强大的 XML 消息传递能力与 DB2 结合,您可以植入 DB2 表或者使用表中的 DB2 数据来创建 Web 上 B2B 或 B2C 应用程序中常用的消息。

简介

本文描述了可以如何一起使用 MQSeries® 和 DB2® XML Extender 来构造组合 XML 消息传递和数据库访问的应用程序。我们侧重于可以使用 DB2 XML Extender 版本 7.2 安装的一组可选的 DB2 函数和存储过程。使用这些函数和过程,有可能支持使用 XML 消息和 MQ 函数的各种应用程序。这些函数和存储过程提供了一种简便但功能强大的方法来集成各种软件应用程序,构造各种系统(例如,B2B 事务系统和客户关系管理系统)的基本元素。

我们首先提供了 DB2 XML Extender 的快速概述,随后提供了 DB2 7.2 中发布的 DB2 特性的概述。在这一背景下,然后我们又回顾了将 DB2 MQ 特性与 XML 消息传递集成的最新 DB2 XML Extender 能力。最后,我们通过保险软件应用程序说明了某些用法示例。





回页首


XML Extender 概述

过去几年来,XML 已经成为被接受的数据交换标准。开发 DB2 XML Extender 是为了将 IBM 的 DB2 Universal Database™ (DB2 UDB) 的强大能力与 XML 的灵活性集成。这会允许 XML 应用程序利用 DB2 的强大能力。

图 1中显示了样本 XML 文档,它在本文中用于演示目的。对于每个 XML 文档,可以使用数据类型定义(Data Type Definition (DTD))文件来定义 XML 元素和属性以及验证 XML 文档的语法。 图 2显示了可用于验证 图 1中的应用程序 XML 文档的 DTD 文件(insurance.dtd)。


图 1. 样本 XML 文档
     <?xml version="1.0"?>
        
     <!DOCTYPE Application SYSTEM
"c:\dxx\samples\dtd\insurance.dtd">
     <Application key="123">
      <Insured>
       <Name>John Doe</Name>
       <DateOfBirth>1950-01-01</DateOfBirth>
       <Coverage>
        <Amt>100000</Amt>
        <Code>Life1</Code>
       </Coverage>
      </Insured>
      <Agent>
       <Id>A101</Id>
       <Agent_Name>Brian Lee</Agent_Name>
      </Agent>
     </Application>


图 2. 样本 DTD 文件(文件名:insurance.dtd)
<?xml encoding="US-ASCII"?>
        
<!ELEMENT Application (Insured, Agent)>
<!ATTLIST Application key CDATA #REQUIRED>
<!ELEMENT Insured (Name, DateOfBirth, Coverage)>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT DateOfBirth (#PCDATA)>
<!ELEMENT Coverage (Amt, Code)>
<!ELEMENT Amt (#PCDATA)>
<!ELEMENT Code (#PCDATA)>
<!ELEMENT Agent (ID, Agent_Name)>
<!ELEMENT ID (#PCDATA)>
<!ELEMENT Agent_Name (#PCDATA)^gt;

XML Extender 提供了许多特性帮助您使用 DB2 来管理和开发 XML 数据,这些特性包括:

  • 选择按原样操作或者映射成关系表的方式使用 XML

    XML 列(XML column)— 这个方法将原样 XML 文档存储在 DB2 中。将文档插入到支持 XML 的列中(请参阅下面新扩展的数据类型),并且可以更新、检索和搜索这些文档。可以将元素和属性数据映射成 DB2 表(称为副表),也可以为这些表建立索引以提供快速搜索。

    XML 集合(XML collection)— 这个方法将 XML 文档结构映射成一个或多个 DB2 表,这样您可以从现有的 DB2 数据组合 XML 文档或者将 XML 文档分解(我们的意思是存储未标记的元素或属性内容)成传统的 DB2 表。

  • 映射方案,它以 文档访问定义(Document Access Definition(DAD))文件表示,将进入的 XML 文档映射成未标记的关系数据(也称为“切碎 (shred)”或“分解 (decompose)”)或者从现有的关系数据生成输出的 XML 文档。DAD 文件还用于将存储原样 XML 文档的 XML 列映射成 DB2 副表。通常为副表建立索引以提供快速搜索。

  • 存储和访问 XML 文档的扩展数据类型、函数和存储过程。这些是以模式 DB2XML 定义的。提供下列用户定义的类型(UDT)用于这些新的 XML 特性:
    XMLVARCHAR:用于存储在 DB2 中的小文档
    XMLCLOB:用于存储在 DB2 中的大文档
    XMLFILE:用于存储在 DB2 之外的文档

除了 XML 特定数据类型之外,可以使用一组 用户定义的函数(UDF)将 XML 文档存储在 XML 列中并从中检索。例如,下列 SQL 从服务器文件中读取 XML 文档,然后将它插入 XML 列中。XML_APPLICATION_TAB 表的列 XML_APP 被定义成 XMLVarchar 类型。

示例 1:

INSERT INTO xml_application_tab (ID, TYPE, XML_APP)
        
VALUES('1234','Group', db2xml.XMLVarcharFromFile('c:\samples\application.xml'))

另外,XML Extender 为各种 SQL 数据类型提供了一组抽取函数。它们从 XML 文档中抽取元素内容或属性值并将它们转换成由函数名指定的数据类型。例如,下列 SQL 语句从文件读取 XML 文档,然后以整数格式返回 Coverage Amount。

示例 2:

values db2xml.EXTRACTINTEGER(db2xml.XMLVarcharFromFile
        
('c:\samples\application.xml'), '/Application/Insured/Coverage/Amt')

所有抽取函数都采用两个输入参数。第一个参数是 XML Extender UDT。第二个参数是指定 XML 元素或属性的位置路径。在上面的 示例 2中,从文件中读取 XML 文档作为 XMLVARCHAR 类型。使用由 XML Extender 提供的表抽取函数可以在一个函数调用中查询多个 XML 文档。

DAD 文件本身是 XML 文档。当它使用 XML 列或 XML 集合时,将 XML 文档结构与 DB2 数据库表中的列关联。在 图 3中显示了指定表和样本保险 XML 文档结构之间关系的样本 DAD 文件。在这个简单演示中,DAD 文件描述了 图 1中显示的 XML 文档的元素和属性可以从两个表的列中派生。可以使用下列 SQL 语句来创建这两个表:

create table application_tab(app_key integer, name varchar(16),
        
dob date, coverage_code varchar(8), amt decimal(10,2), agent_id
varchar(16))
create table agent_tab(agent_id varchar(16), agent_name
varchar(16))

insert into application_tab values (123, 'John Doe',
'1950-01-01', 'Life1', 100000.00, 'A101')
insert into agent_tab values ('A101', 'Brian Lee')


图 3. 使用 SQL 映射的样本 DAD 文件
<?xml version="1.0"?>
        
<!DOCTYPE DAD SYSTEM "c:\dxx\dtd\dad.dtd">
<DAD>
<validation>NO</validation>
<Xcollection>
 <SQL_stmt>select app_key, name, dob, amt, coverage_code, b.agent_id, agent_name
     from application_tab a, agent_tab b where a.agent_id = b.agent_id
     ORDER BY app_key, agent_id</SQL_stmt>
 <prolog>?xml version="1.0"?</prolog>
 <doctype>!DOCTYPE Application SYSTEM "c:\dxx\samples\dtd\insurance.dtd"</doctype>
 <root_node>
  <element_node name="Application">
   <attribute_node name="key">
   <column name="app_key"/>
   </attribute_node>
   <element_node name="Insured">
    <element_node name="Name">
    <text_node><column name="name"/></text_node>
    </element_node>
    <element_node name="DateOfBirth">
    <text_node><column name="dob"/></text_node>
    </element_node>
    <element_node name="Coverage">
     <element_node name="Amt">
     <text_node><column name="amt"/></text_node>
    </element_node>
    <element_node name="Code">
    <text_node><column name="coverage_code"/></text_node>
    </element_node>
   </element_node>
   </element_node>
   <element_node name="Agent">
    <element_node name="ID">
    <text_node><column name="agent_id"/></text_node>
    </element_node>
    <element_node name="Agent_Name">
    <text_node><column name="agent_name"/></text_node>
    </element_node>
   </element_node>
  </element_node>
 </root_node>
</Xcollection>
</DAD>

通过使用 图 3中显示的 DAD 文件以及先前创建的两个表,我们可以编写调用由 DB2 XML Extender 提供的存储过程的 C 程序。程序将生成(组合)一个保险策略应用程序 XML 文档,如 图 1所示。注:在所有示例中,我们都使用带有嵌入式 SQL 的 C 程序。这样,对于存储过程调用的每个参数都使用一个指示符变量。为简单起见,我们只显示示例中的 SQL 调用语句。在 附录 B中显示了一个使用嵌入式 SQL 并调用 DB2 XML 存储过程的样本 C 程序节。在 附录 A中还描述了存储过程参数。

下面的示例假设结果表是用 XML_APPLICATION_TAB 的名称创建的,并且该表有一列的类型为 XMLVARCHAR(请参考 附录 B中的 C 程序以获取详细信息)。程序运行结束时,将可以从这个表列获取 XML 文档(如 图 1 所示)。

示例 3:

EXEC SQL CALL db2xml.DXXGENXML(:dad :dad_ind;
        
                         :resultTabName
                         :rtab_ind,
                         :overrideType
                         :ovtype_ind,:override:ov_ind,
                         :maxrow
                         :maxrow_ind,:numrow
                         :numrow_ind,
                         :returnCode
                         :returnCode_ind, :returnMsg
                         :returnMsg_ind);

在 DB2 XML Extender 中还提供了用来分解 XML 文档的存储过程。例如,下列存储过程调用将 DAD 文件用于 XML 集合将 XML 文档分解成 DB2 表的集合。分解过程需要类似的 DAD 文件,但是该文件使用 RDB_node 映射而不是我们用来组合 XML 文档的 SQL 映射。在 图 4中显示了使用 RDB_node 映射的样本 DAD 文件。所有这些存储过程都是以 db2xml 模式定义的。

示例 4:

EXEC SQL CALL db2xml.DXXSHREDXML(:dad :dad_ind,
        
                         :xmlDoc :xmlDoc_ind,
                         :returnCode
                         :returnCode_ind,
                         :returnMsg :returnMsg_ind)


图 4. 使用 RDB_node 映射的样本 DAD 文件
<?xml version="1.0"?>
        
<!DOCTYPE DAD SYSTEM "c:\dxx\dtd\dad.dtd">
        
<DAD>
        
<dtdid>neworder.dtd</dtdid>
        
 <validation>YES</validation>
        
 <Xcollection>
        
<prolog>?xml version="1.0"?</prolog>
        
<doctype>!DOCTYPE Order SYSTEM "c:\dxx\samples\dtd\neworder.dtd"</doctype>
        
 <root_node>
        
 <element_node name="Order">
        
  <RDB_node>
        
   <table name="order_tab" key="order_key"/>
         
   <table name="part_tab" key="part_key"/>
        
   <table name="ship_tab" key="date"/>
        
   <condition>order_tab.order_key=part_tab.o_key AND part_tab.part_key=ship_tab.p_key</condition>
        
  </RDB_node>
        
  <attribute_node name="Key">
        
   <RDB_node>
        
    <table name="order_tab"/>
        
    <column name="order_key" type="integer"/>
        
   </RDB_node>
        
  </attribute_node>
        
  <element_node name="Customer">
        
   <element_node name="Name">
        
    <text_node>
        
     <RDB_node>
        
      <table name="order_tab"/>
        
      <column name="customer_name" type="varchar(16)"/>
        
     </RDB_node>
        
    </text_node>
        
   </element_node>
        
   <element_node name="Email">
        
    <text_node>
        
     <RDB_node>
        
      <table name="order_tab"/>
        
      <column name="customer_email" type="varchar(16)"/>
        
     </RDB_node>
        
    </text_node>
        
   </element_node>
        
  </element_node>
        
  <element_node name="Part">
        
   <attribute_node name="Color">
        
    <RDB_node>
        
     <table name="part_tab"/>
        
     <column name="color" type="char(6)"/>
        
    </RDB_node>
        
   </attribute_node>
        
   <element_node name="Key">
        
    <text_node>
        
     <RDB_node>
        
      <table name="part_tab"/>
        
      <column name="part_key" type="integer"/>
        
     </RDB_node>
        
    </text_node>
        
   </element_node>
        
   <element_node name="ExtendedPrice">
        
    <text_node>
        
     <RDB_node>
        
      <table name="part_tab"/>
        
      <column name="price" type="decimal(10,2)"/>
        
      <condition>price > 2500.00</condition>
        
    </RDB_node>
   </text_node>
        
  </element_node>
        
  <element_node name="Tax">
        
   <text_node>
        
    <RDB_node>
        
     <table name="part_tab"/>
        
     <column name="tax" type="real"/>
        
    </RDB_node>
        
   </text_node>
        
  </element_node>
        
   <element_node name="Quantity">
        
    <text_node>
        
     <RDB_node>
        
      <table name="part_tab"/>
        
      <column name="qty" type="integer"/>
        
     </RDB_node>
        
    </text_node>
        
   </element_node>
        
   <element_node name="Shipment" multi_occurrence="YES">
        
    <element_node name="ShipDate">
        
     <text_node>
        
      <RDB_node>
        
       <table name="ship_tab"/>
      





回页首


DB2 MQ XML 新特性

DB2 XML Extender 版本 7.2 通过添加允许从 DB2 XML 应用程序直接访问 DB2 MQ 函数的函数和存储过程扩展了其能力。请参阅 Using MQSeries from DB2 Applications以获取这些集成函数的概述。在本文中,我们将这些函数称为 DB2 MQ 函数,并且这里我们显示了如何使用它们的一些示例。

MQSeries 是市场上主导的消息传递中间件。它是一个灵活的消息传递系统,允许应用程序在使用不同消息传递模型的分布式、异构环境下进行通信。这里描述的 MQ 函数和存储过程是使用 MQSeries 的应用程序消息传递接口(Application Messaging Interface (AMI))开发的。MQSeries AMI 中的两个关键概念被带到这些 DB2 MQ 新函数中。它们是:

  • 服务点(Service points):可能从中发送或接收消息的逻辑点。它是指通过 AMI 配置的队列管理器中的特殊队列。
  • 策略(Policies):定义服务选项的质量(例如,优先级和持久性等)

使用 AMI 在消息传递操作和说明应该如何进行那些操作的定义之间进行了明确的划分。这就产生了一组新的易于配置并易于使用的 DB2 MQ 函数和存储过程。

通过将新的 DB2 MQ 函数安装成 DB2 XML Extender 一部分,您的应用程序可以:

  • 可以象对待在 MQSeries AMI 中定义的服务点(队列)中的 XML 消息那样使用 SQL 语句来发送、读取或接收文档。下列 SQL 语句使用缺省的 AMI 服务点配置来读取 XML 消息。

    示例 5:

    values db2xml.MQREADXML()
  • 从表中组合 XML 消息,然后将它直接发送到消息队列。或者,将队列中的 XML 消息列分解到关系表中。这里有一个如何使用 XML Extender 过程完成 XML 消息分解和存储的示例。

    示例 6:

    EXEC SQL CALL db2xml.DXXMQSHRED(:serviceName:serviceName_ind,
                
         :policyName:policyName_ind,
         :dadFileName:dadFileName_ind,
         :status:status_ind)

    这个语句从队列读取 XML 消息,使用由 dadFileName 变量指定的 DAD 文件来分解该消息,然后将未标记的数据字段存储到用 DAD 文件自身指定的数据库表中。

可以从任何 DB2 支持的编程模型(C、Java™ 和 SQL 等)中使用所有 DB2 MQ 新特性。另外,从 WebSphere® MQIntegrator® 或 MQSeries Publish/Subscribe SupportPac安装消息代理之后,发布/订阅(Publish/Subscribe)消息传递类型也可以作为 DB2 MQ 特性的一部分使用了。因为 WebSphere MQIntegrator 支持 XML 标准,所以可以使用更高级的消息处理功能。





回页首


限制

目前,可以在下列平台上使用 DB2 MQ 函数:Windows NT®、Windows® 2000、AIX®、Sun Solaris 和 HP-UX。正在规划 OS/390® 和 z/OS™ 上的支持。

本文示例中的 XML 消息传递文档被存储为 XMLVARCHAR 类型。目前,DB2 MQ 函数对于 XMLVARCHARr 类型的长度限制为 4000 个字符。还可以使用一组匹配的函数和存储过程来处理存储为 XMLCLOB 类型的 XML 文档。这些函数和过程可以处理最大长度为 1 GB 的 XML 文档。有关处理 XMLCLOB 类型文档的函数和存储过程的信息,请参考 DB2 XML Extender MQSeries XML Functions and Stored Procedures, Release Notes, Version 7.2

另外,MQSeries 提供了将消息操作和数据库操作组合在象原子事务一样的单一工作单元中的能力。目前,DB2 MQ 函数还不支持这个特性。





回页首


用法方案

有各种数据库应用程序方案可以从组合 MQSeries 与 XML 消息传递中获益。在本节中,我们查看保险公司中可以从这些新特性获益的一些方案。在 图 5中描述了保险操作的子集。我们将继续使用本文开头给出的样本用于演示目的。


图 5. 保险操作方案的一部分
保险操作方案图

发送和检索 XML 消息

最简单的应用程序方案可能是交换数据报以协调多个应用程序、交换信息、请求服务和提供感兴趣的事件的通知等。

例如,假设您有一个数据库表 NEW_BUSINESS,它有名为 INSURANCE_APP 的 XMLVARCHAR 类型列。该表用于存储通过网站提交的保险申请。下列语句将每份保险申请(以 XML 格式)发送到缺省服务点(队列)。


示例 7:
select db2xml.MQSENDXML(INSURANCE_APP)
        
from NEW_BUSINESS

这一操作将 NEW_BUSINESS 表中的每份保单申请发送到队列,在那里它们会由保险新业务(New Business)或承保系统(Underwriting Systems)拾取以供进一步处理。这可能是保险公司在每天业务结束时进行批处理的第一步。

假设一份保单申请目前作为独立文件存储在 DB2 表之外。下列 SQL 语句将使用策略 MY.AMI.POLICY 将“c:\xml\my_application.xml”中包含的 XML 文档发送到服务 MY.AMI.SERVICE。这里,相关标识“Group”用于表示这是一个集团保单申请,因此集团管理系统(Group Administration System)可以识别共享队列中的保险申请并检索它以供进一步处理。


示例 8:
values db2xml.MQSENDXML('MY.AMI.SERVICE',
        
'MY.AMI.POLICY', 'c:\xml\my_application.xml', 'Group')

接收到队列结束时,应用程序可以将标记的 XML 格式文档完整地以 XML 列的格式存储,或者使用 Decomposing XML messages [产品,作为参考的代码] 中描述的存储过程来分解文档,并用一组 DB2 表(XML 集合)来保存信息(字段和属性)。

下列 SQL 语句简单地使用缺省 AMI 策略(DB2.DEFAULT.POLICY)从由 APPLICATION_SERVICE 定义的队列中读取第一份保险申请。


示例 9:
values db2xml.MQREADXML('APPLICATION_SERVICE')

下列 SQL 语句从队列中检索并除去具有相关标识“Health”(表示它们是健康保险申请 (Health Insurance Applications))的前 50 个保险申请。队列是由 Underwriting_Service AMI 服务点指出的,并且 AMI 策略“Underwriting_Policy”指定了服务质量。这个 SQL 语句还将接收到的保险申请与系统日期和时间信息一起存储在 UNDERWRITING 表中。


示例 10:
insert into UNDERWRITING
        
select current timestamp, t.msg from table
          (db2xml.MQRECEIVEALLXML('Underwriting_Service',
'Underwriting_Policy', 'Health', 50)) t

分解 XML 消息

组合 MQ 函数的分解存储过程包括:

  • DXXMQINSERT()
  • DXXMQINSERTALL()
  • DXXMQSHRED()
  • DXXMQSHREDALL()

这些过程将队列中的进入 XML 文档分解(或“切碎”),并将单个数据元素存储在现有的数据库表中。DXXMQINSERT() 和 DXXMQINSERTALL() 过程将队列中的所有 XML 文档分解,然而 DXXMQSHRED() 和 DXXMQSHREDALL() 仅分解队列中的第一个消息。

这些存储过程还因输入参数不同而不同。DXXMQINSERT() 和 DXXMQINSERTALL() 过程采用启用的 XML 集合名称作为输入。DAD 文件被用作输入以生成启用的 XML 集合并返回集合名称。DXXMQSHRED() 和 DXXMQSHREDALL() 采用一个 DAD 文件作为输入。使用启用的 XML 集合作为输入的存储过程通常会有更好的性能。

在下列存储过程调用中,DXXMQINSERTALL() 从由 serviceName定义的队列中检索所有 XML 文档,分解这些文档,然后根据在用来启用它的 DAD 文件中指定的映射将数据插入表中。


示例 11:
EXEC SQL CALL db2xml.DXXMQINSERTALL(:serviceName
        
                    :serviceName_ind,
                    :policyName :policyName_ind,
                    :collection :collection_ind,
                    :status :status_ind)

这个 SQL 语句假设已经在 AMI 中定义了由 serviceName 表示的 AMI 服务和由 policyName 表示的策略。

在我们的保险申请方案中,保单申请文档至少包括三组信息:

  • 被保险人/投保人信息(姓名、地址、出生日期、社会保障号码等)
  • 代理信息(代理标识、代理姓名、服务级别等)
  • 承保范围信息(产品标识、申请日期、保险金额等)

将保险申请消息分解成分别存储一类信息的三个表使思路很清晰。但是,为简单起见,我们的示例只使用申请表和代理表。上面的存储过程调用将数据记录插入两个预定义的 DB2 表中。结果,每个表都将包含在消息传递队列中接收到的一个保险申请的记录。保险申请文档被分解成关系表中的未标记的非 XML 数据元素后,可以使用标准的基于 SQL 的应用程序执行后继处理。

组合 XML 消息

使用组合存储过程 DXXMQGEN() 和 DXXMQRETRIEVE() 来从数据库表中的数据生成 XML 文档。将生成的 XML 文档发送到通过 MQSeries AMI 定义的队列。DXXMQGEN() 采用 DAD 文件作为输入(如 图 3所示)。DXXMQRETRIEVE() 采用启用的 XML 集合名称作为输入。它们基本上生成相同的最终 XML 文档(如 图 1所示)。

下列样本调用生成 XML 文档,然后将它发送到队列:


示例 12:
EXEC SQL CALL db2xml.DXXMQGEN(:serviceName :serviceName_ind,
        
                    :policyName :policyName_ind,
                    :dad :dad_ind,
                    :overrideType :ovtype_ind,
                    :override :ov_ind
                    :maxrow :maxrow_ind,
                    :numrow :numrow_ind,
                    :status :status_ind)

DAD 文件指定将如何把各种表中的数据组装在一起以生成最终的 XML 文档。用户还可以使用 max_row 参数指定要在每个调用中生成的 XML 文档的最大数目,或者他们可以通过使用参数 overrideType 和 override(请参阅 附录 A中的定义)来覆盖 DAD 文件中的特定条件。这一覆盖功能允许应用程序通过覆盖 DAD 文件中的 <SQL_stmt> 标记值或者 RDB_node 映射的 RDB_nodes 中的条件来执行动态查询。在 图 2的示例中,DAD 文件中的 <xcollection> 元素具有一个 <SQL_stmt> 元素。例如,通过更改 ORDER_BY 子句, override参数可以覆盖 <SQL_stmt> 的值。

当保险申请被批准并且发出保单时,我们可能想要将一些有关信息(例如,概括承保范围的保单页)发送给投保人。保险管理系统结束其保单发出过程后,就可以在数据库中容易地使用保单页的数据了。可能跨越几个不同的表存储数据,并且可能需要抽取和格式化这些数据。上面描述的 DB2 MQ 存储过程为生成保单页文档并将其发送到指定的队列提供了一种十分有效的方法。打印作业系统可以从队列接收 XML 格式的保单页文档,打印出来,然后将它邮寄给投保人。

使用 WebSphere MQIntegrator 发布/订阅

可以将发布/订阅消息传递模型与 IBM WebSphere MQIntegrator 软件或者简单的 MQSeries Publish/Subscribe SupportPac结合使用。该模型的最常见用法是以及时方式传布实时信息。

例如,下列 SQL 语句从使用 AMI 服务 APPLICATION_SERVICE 定义的队列中读取一份保单申请。然后,它使用指定的位置路径从 XML 文档中抽取 Agent ID 数据组件,然后使用通过 AMI 定义的 PUBLISH_SERVICE 和 PUBLISH_POLICY 发布。在带有相关标识“Annuity”的主题“Agent”下发布数据元素。这允许已经订阅了“Agent”主题的用户能够在其通过 AMI 定义的订户服务队列中接收到这条信息,并且进一步将代理与 Annuity 产品相关联。


示例 13:
values db2mq.MQPUBLISH('PUBLISH_SERVICE', 'PUBLISH_POLICY',
        
db2xml.EXTRACTVARCHAR(db2xml.MQREADXML('APPLICATION_SERVICE'),
                    '/Application/Agent/Id'),
               'VariableRate', 'Annuity')

因为 WebSphere MQIntegrator 支持基于 XML 的自定义消息,所以应用程序可以利用该产品提供的许多高级特性。例如,订阅应用程序现在可以根据发行物的主题和/或消息的特定内容来选择接收什么样的发行物。





回页首


总结

DB2 MQ 函数和 XML Extender 的组合可用于满足各种应用程序需要。DB2 MQ XML 新特性易于使用,并且提供了强大的功能和函数指令系统。特别在跨越各种平台集成一组异构应用程序时,您可以通过使用一组函数和存储过程更有效地开发数据库应用程序。





回页首


其它参考资料

可以在标题为 “Using MQSeries from DB2 Applications”的 DB2 开发者园地文章中找到关于 DB2 MQ 函数的更多信息。

可以从下列网站获取有关 DB2、XML Extender 和 MQSeries 的其它信息:

可以从下列产品文档中获取相关信息:





回页首


附录

附录 A. 存储过程参数的定义

参数 描述 IN/OUT
参数


xmlDoc XMLCLOB 类型的 XML 文档对象。IN
dad 包含 DAD 文件的 CLOB。IN
collectionName 启用的 XML 集合的名称。IN
resultTabName 应该在调用之前存在的结果表的名称。该表只包含 XMLVARCHAR 或 XMLCLOB 类型的一列。IN
overrideType 表示下列 override参数类型的标志: IN
  NO_OVERRIDE:      不覆盖。 
  SQL_OVERRIDE:      由 SQL_stmt 覆盖。 
  XML_OVERRIDE:      由基于 XPath 的条件覆盖。 
Override

覆盖 DAD 文件中的条件。输入值基于 overrideTypeIN
  NO_OVERRIDE:      NULL 字符串。
  SQL_OVERRIDE:      有效的 SQL 语句。使用这个 overrideType需要在 DAD 文件中使用 SQL 映射。输入 SQL 语句覆盖 DAD 文件中的 SQL_stmt。  
  XML_OVERRIDE:      包含由“AND”分隔的双引号中的一个或多个表达式的字符串。使用这个 overrideType需要在 DAD 文件中使用 RDB_node 映射。

 
maxRows 结果表中的最大行数。IN
numRows 结果表中生成的实际行数。OUT
returnCode 来自存储过程的返回码。OUT
returnMsg 错误情况下返回的消息文本。OUT




回页首


附录 B. 调用存储过程的样本 C 代码

使用 图 3中显示的 DAD 文件以及先前创建的表 application_tab 和 agent_tab,下列 C 程序调用由 DB2 XML Extender 提供的存储过程,然后组合成保单申请 XML 文档。 图 1显示了最终的 XML 文档样本。代码假设结果表是使用名称 XML_APPLICATION_TAB 创建的,并且该表具有 XMLVARCHAR 类型的列 XMLAPP。在程序运行结束时,将可以从这个表列获取 XML 文档(如 图 1所示)。

     /***************************************************************************************
* The following code will construct XML documents using data that is stored in the XML collection tables
* that are specified by the <Xcollection> in the DAD file application.dadand inserts each XML
* document as a row into the result table xml_application_tab.
***************************************************************************************/

   #include "dxx.h"
#include "dxxrc.h"

EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;

   SQL TYPE is CLOB(100K) dad;

SQL TYPE is CLOB_FILE dadfile;
char result_tab [32 ];
char override [2 ];

short overrideType;

short max_row;

short num_row;

long returnCode;
char returnMsg [1024 ];
short dad_ind;
/*content of DAD file for composing XML doc */
/*DAD file name */
/*name of the result table */
/*override the condition in the DAD file, will set to NULL here */
/*can be set to NO_OVERRIDE, SQL_OVERRIDE, or XML_OVERRIDE */
/*maximum number of rows in the result table*/
/*actual number of generated rows in the result table */
/*return error code */
/*error message text */
/* indicator variable for NULL input of dad */
   short rtab_ind;
short ovtype_ind;
short ov_inde;
short maxrow_ind;
short numrow_ind;
short returnCode_ind;
short returnMsg_ind;

  EXEC SQL END DECLARE SECTION;
  /*create result table */
  EXEC CREATE TABLE xml_application_tab (xmlapp XMLVarchar);
strcpy(dadfile.name,"c:\dxx\dad\application.dad");
dadfile.name_length =strlen("c:\dxx \dad\application.dad");
dadfile.file_options =SQL_FILE_READ;
EXEC SQL VALUES (:dadfile) INTO :dad; /*read data from a file to a CLOB */
strcpy(result_tab,"xml_application_tab");
override [0 ]='\0';
overrideType = NO_OVERRIDE;
max_row =500;
num_row =0;
returnCode =0;
msg_txt [0 ]='\0';
collection_ind =0;
  dad_ind =0; /* 0 indicates actual input is provided */
  rtab_ind =0;
  ov_ind =-1; /* -1 indicates NULL is provided as input */
  ovtype_ind =0;
maxrow_ind =0;
numrow_ind =-1;
returnCode_ind =-1;
returnMsg_ind =-1;

  /*Call the store procedure */
  EXEC SQL CALL DB2XML.DXXGENXML(:dad :dad_ind,
                    :result_tab :rtab_ind,
                    :overrideType :ovtype_ind,:override:ov_ind,
                    :max_row :maxrow_ind,:num_row :numrow_ind,
                    :returnCode :returnCode_ind, :returnMsg :returnMsg_ind);



作者简介

Morgan Tong 是位于奥斯汀的 IBM Database Technology Institute for e-Business 的成员。他具有丰富的应用程序开发经验,包括六年多的保险应用软件开发经验。可以通过 tongm@us.ibm.com与 Morgan 联系。


Dan Wolfson 是 IBM Database Technology Institute for e-Business 的一名资深技术人员和经理。Dan 具有 15 年以上分布式计算的经验,他的广泛兴趣范围涉及数据库、消息传递和事务系统。目前,Dan 是致力于 XML 和将 DB2 与 WebSphere 和 MQSeries 集成的主要设计师。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?







回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款