结合使用 CICS 和 DB2 pureXML

来源:百度文库 编辑:神马文学网 时间:2024/04/27 18:34:13

 

CICS 和 pureXML 简介

CICS Web 服务支持在 CICS TS V3.1 中已变得可用。该特性使得 CICS 应用程序有可能成为服务请求者、服务提供者,或者两者都是,可使用 HTTP 传输或 WebSphere? MQ 传输。Web 服务消息通常是 XML 形式的,且合并有 SOAP 头,所以本文称之为 SOAP 消息。有关 CICS Web 服务支持的更多信息,请参考本文末尾 参考资料 部分的适当链接。

DB2 9.1 for z/OS? 增加了对 XML 数据类型的支持(称为 pureXML),从而允许原生地存储和索引 XML 数据。原生的 XML 支持意味着,XML 在存储时就被解析了。维护有 XML 索引,因而可以通过 XPath 和 SQL/XML 查询快速访问存储的 XML。此外,在 DB2 10.1 中(本文发表之时还处于 beta 版本),存储的 XML 也可以通过 XPath 更新。有关 DB2 pureXML 的更多信息,请参考本文末尾 参考资料 部分的适当链接。

本文通过结合使用 CICS 和 DB2 pureXML,展示如何使用 CICS Web 服务支持来存储和检索 SOAP 消息。场景简要描述了连接 CICS Web 服务和 DB2 pureXML 后端之间的端到端所需的配置和部署。下载 部分提供了样例代码。样例源代码是用 COBOL 编写的,但是将代码转换成 PL/I 或 C 编程语言会更直观。

介绍两个场景

两个场景共享相同的 CICS 区域,该区域运行的是 CICS TS 4.1。XML 数据存储在 DB2 9.1 表中,其中包含单个 XML 类型的列。清单 1 包含创建该表的 SQL 代码。


清单 1. 创建带有单个 XML 类型的列的表
                CREATE TABLE REDBOOK.PUREXML (SOAP XML) CCSID EBCDIC IN DATABASE REDBOOK;                

下载 部分的样例代码包含用于创建数据库 STOGROUP、TABLESPACE 和 TABLE 的完整 SQL。

第一个场景展示,一个名为 WEBINST 的 COBOL CICS 程序(一个管道处理程序和服务提供程序)如何将其从 Web 服务接收的 XML 消息插入 DB2 pureXML 列中。第二个场景展示,一个名为 WEBSLCT 的 COBOL CICS 程序(也是一个管道处理程序和服务提供程序)如何从 DB2 pureXML 列中检索 XML,并将之作为响应返回给 Web 服务调用。

场景 1:存储通过 CICS Web 服务进来的数据

此场景中的步骤展示如何配置 CICS 区域,以接受入站 Web 服务请求并将 SOAP 有效负荷存储在 DB2 中。为了简化本例,以将注意力放在设置 Web 服务的机制上,这里将输入消息作为 Web 服务的输出消息返回。

本例不是使用 CICS 提供的管道处理程序(DFHWS2LS0)——它将 SOAP 数据(XML)转换成二进制语言结构,而是使用一个定制的管道处理程序(名为 WEBINST)来接收 SOAP 消息并将之直接插入 DB2 中。这无需让 CICS 解析 XML,因而改善了性能。

步骤 1 — 创建 CICS 管道配置文件

将清单 2 中所示的管道配置文件作为 /u/user/config/insert_pipeline.xml 复制到 UNIX? System Services (USS)。该配置文件通知 CICS,这个名为 WEBINST 的定制管道处理程序将被用于处理 Web 服务请求。


清单 2. CICS 管道配置文件
                                                                                                WEBINST                                                                                                

步骤 2 — 创建和安装 CICS 资源

在 CICS 区域中创建和安装以下 CICS 资源:

  • PIPELINE(WEBINST) CONFIGFILE(/u/user/config/insert_pipeline.xml) SHELF(/u/user/shelf)
  • URIMAP(WEBINST) USAGE(PIPELINE) PIPELINE(WEBINST) HOST( * ) PATH(/pureXML/insert)
  • PROGRAM(WEBINST) DATALOCATION(ANY)
  • TCPIPSERVICE(PUREXML) PORT(xxxxx) PROTOCOL(HTTP)

以下资源是 DB2 所必需的,也可跟本文场景 2 中描述的 WEBSLCT 程序共享。

  • DB2ENTRY(PUREXML) ACCOUNTREC(TXid) AUTHTYPE(Userid) DRollback(Yes) PLAN(PUREXML)
  • DB2TRAN(PUREXML) ENTRY(PUREXML) TRANSID(CPIH)

将清单 3 中所示的 COBOL 程序复制到 z/OS,并用集成的 DB2/CICS/COBOL 编译器编译它。下载 部分的样例代码包含样例编译作业。


清单 3. COBOL 程序
                ******************************************************************                IDENTIFICATION DIVISION.                PROGRAM-ID. WEBINST.                ENVIRONMENT DIVISION.                CONFIGURATION SECTION.                *                DATA DIVISION.                *                WORKING-STORAGE SECTION.                *                01  WSRESP    PIC S9(8)   COMP VALUE 0.                01  WSRESP2   PIC S9(8)   COMP VALUE 0.                01  WSFLENGTH PIC S9(8)   COMP VALUE 1024.                01  XMLDATA   PIC X(1024) VALUE SPACES.                EXEC SQL INCLUDE SQLCA END-EXEC.                LINKAGE SECTION.                PROCEDURE DIVISION.                MAINLINE SECTION.                * Get the SOAP data                EXEC CICS GET CONTAINER('DFHREQUEST')                INTO(XMLDATA)                FLENGTH(WSFLENGTH)                RESP(WSRESP)                RESP2(WSRESP2)                END-EXEC.                EXEC SQL                INSERT INTO REDBOOK.PUREXML                ( SOAP )                VALUES ( :XMLDATA )                END-EXEC                * Respond with the original XML data by deleting DFHREQUEST                * container and returning DFHRESPONSE container                EXEC CICS DELETE CONTAINER('DFHREQUEST') END-EXEC.                EXEC CICS PUT CONTAINER('DFHRESPONSE')                FROM(XMLDATA)                RESP(WSRESP)                RESP2(WSRESP2)                END-EXEC.                * Exit program                EXEC CICS RETURN END-EXEC.                MAINLINE-EXIT.                EXIT.                *----------------------------------------------------------------*                

步骤 3 — 从 Rational Developer for System z 测试 Web 服务

在基于 Eclipse 的 IDE(例如,Rational? Developer for System z?)中创建一个项目,并将样例代码中的 SWITCH.wsdl 文件导入到项目中。

右键单击样例 WSDL 文件并选择 Web Services > Test with Web Services Explorer,如图 1 所示。


图 1. Test with Web Services Explorer

从 Endpoints 对话框(图 2),使用 CICS TCPIPSERVICE 资源中指定的 TCP/IP 服务更新 URI 以指向您的 z/OS 映像,并单击 Go


图 2. 添加新的 Endpoint

在 Invoke a WSDL Operation 窗体(图 3)的字段中输入测试数据,并单击 Go


图 3. 输入测试数据以产生 SOAP 消息

Eclipse 基于您在窗体中输入的数据产生一个 SOAP 消息,并将之发送到 CICS。CICS 将 SOAP 传递到步骤 1 中创建的 WEBINST 定制管道处理程序。WEBINST 将数据插入到名为 REDBOOK.PUREXML 的 DB2 表的 XML 列中。WEBINST 应用程序也返回初始的 SOAP 消息作为响应,如图 4 中的 Web Services Explorer 屏幕截图所示。


图 4. 请求和响应 SOAP 消息

步骤 4 — 展示数据真正存储在数据库中

这最后一步证实数据被插入到了 DB2 表中。从一个诸如 DB2 SPUFI 之类的工具,执行清单 4 所示的 SQL 语句。


清单 4. 展示数据存储在数据库中的 SQL 语句
                SELECT * FROM REDBOOK.PUREXML                

清单 5 展示上面 SQL 语句返回的 DB2 数据。


清单 5. SQL 语句返回的数据
                ---------+---------+---------+---------+---------+---------+---------+---------+                SELECT * FROM REDBOOK.PUREXML;                                00010000                ---------+---------+---------+---------+---------+---------+---------+---------+                ....                ---------+---------+---------+---------+---------+---------+---------+---------+                   
                                                                                                WEBSLCT                                                                                                

步骤 2 — 创建和安装 CICS 资源

在 CICS 区域中创建和安装以下资源:

  • PIPELINE(WEBSLCT) CONFIGFILE(/u/user/config/select_pipeline.xml) SHELF(/u/user/shelf)
  • URIMAP(WEBSLCT) USAGE(PIPELINE) PIPELINE(WEBSLCT) HOST(*) PATH(/pureXML/select)
  • PROGRAM(WEBSLCT) DATALOCATION(ANY)

对于此场景,可以重用在场景 1 中为 WEBINST 定义的 TCPIPSERVICE、DB2ENTRY 和 DB2TRAN 资源。

将清单 7 中所示的 COBOL 程序复制到 z/OS,并利用集成的 DB2/CICS/COBOL 编译器编译它。下载 部分的样例代码包含样例编译作业。


清单 7. COBOL 程序
                ******************************************************************                IDENTIFICATION DIVISION.                PROGRAM-ID. WEBSLCT.                ENVIRONMENT DIVISION.                CONFIGURATION SECTION.                *                DATA DIVISION.                *                WORKING-STORAGE SECTION.                *                01  WSRESP    PIC S9(8)   COMP VALUE 0.                01  WSRESP2   PIC S9(8)   COMP VALUE 0.                01  WSFLENGTH PIC S9(8)   COMP VALUE 1024.                01  XMLDATA   PIC X(1024) VALUE SPACES.                EXEC SQL INCLUDE SQLCA END-EXEC.                LINKAGE SECTION.                PROCEDURE DIVISION.                MAINLINE SECTION.                * Get DB2 data                EXEC SQL                SELECT XMLSERIALIZE(SOAP AS CLOB)                INTO :XMLDATA                FROM REDBOOK.PUREXML                END-EXEC.                * Respond with the XML data by deleting DFHREQUEST                * container and returning DFHRESPONSE container                EXEC CICS DELETE CONTAINER('DFHREQUEST') END-EXEC.                EXEC CICS PUT CONTAINER('DFHRESPONSE')                FROM(XMLDATA)                FLENGTH(WSFLENGTH)                RESP(WSRESP)                RESP2(WSRESP2)                END-EXEC.                * Exit program                EXEC CICS RETURN END-EXEC.                MAINLINE-EXIT.                EXIT.                *----------------------------------------------------------------*                

注意,XMLSERIALIZE 函数在 SQL 语句中被用于 SELECT。这是为了让 XML 声明不被添加到返回的 XML 有效负荷的开头。如果不带 XMLSERIALIZE 使用 SELECT *SELECT SOAP,那么返回的 XML 在开头部分将有一个 XML 声明。此声明宣称 XML 被编码在 CICS 系统的本地代码页。此本地代码页通常是一个 EBCDIC 代码页。在有些情况下,这会导致接收 XML 的应用程序由于不支持 EBCDIC 代码页而拒绝接收它。

步骤 3 — 从浏览器测试 Web 服务

将浏览器指向 WEBINST Web 服务的 URL。例如,在用于构建此场景的样例案例中,此 URL 是:http://winmvsa1.hursley.ibm.com:12345/pureXML/select。

场景 1 中 WEBINST 程序插入的 SOAP 消息被检索到并显示在浏览器中,如图 5 所示。


图 5. WEBINST 程序插入的 SOAP 消息

其他场景

本文中描述的两个场景所演示的例子有很多可能的变体。例子包括:

  • 使用 SQL XML 更新修改 DB2 中存储的 XML,以响应一个请求;例如,更改地址。
  • 在存储之前,使用 SQL XMLTABLE 删除 XML 部分;例如,出于安全原因。
  • 除了将数据存储为 XML 或等价形式之外,使用 SQL XMLTABLE 将 XML 转换成关系列。

这些场景可以支持各种各样的应用程序和服务,比如基于应用程序日志或窗体(例如,XHTML、XFORMS 或 Lotus Forms)的应用程序。

也可以确保 CICS Web 服务是安全的。本文末尾 参考资料 部分提供了到有关该主题详细信息的链接。

结束语和展望

本文演示了,从一个通过 CICS Web 服务调用的 CICS COBOL 应用程序,在 DB2 pureXML 中插入和检索 XML 内容的基本步骤。插入和检索时无需在 CICS 应用程序中解析或构造 XML 数据。输入的 XML 消息直接存储在 DB2 中。输出的 XML 消息是从查询 DB2 中的 XML 数据创建的。使用 DB2 pureXML 作为存储数据库的 CICS Web 服务可以很容易变成大型分布式应用程序(例如,XML 窗体应用程序或消息传递应用程序)的一部分。pureXML 数据库也可以为入站和出站 CICS Web Services XML 消息形成一个可查询的审计或应用程序日志。

致谢

感谢 Maj-Britt Risager(及同事)和 Lars Andersen Hylleberg(及同事)审阅了本文并提供了反馈意见。