本文介紹對用面向商業的通用語言(Common Business OrIEnted Language,COBOL)編寫的 CICS® 應用程序使用 DB2® pureXML®。XML 在 CICS 應用程序中扮演著日益重要的角色。因此,在 CICS 應用程序中存儲和查詢 XML 的需求在不斷增長。本文描述兩個結合使用 CICS 和 DB2 pureXML 的場景。第一個場景展示如何將入站的 XML Web 服務消息存儲在 DB2 pureXML 中,無需首先在 CICS 中解析消息。第二個場景展示 CICS 應用程序如何從 DB2 檢索 XML 數據,並通過 Web 服務傳輸數據。本文提供了可以下載的樣例源代碼。
CICS 和 pureXML 簡介
CICS Web 服務支持在 CICS TS V3.1 中已變得可用。該特性使得 CICS 應用程序有可能成為服務請求者、服務提供者,或者兩者都是,可使用 HTTP 傳輸或 WebSphere® MQ 傳輸。Web 服務消息通常是 XML 形式的,且合並有 SOAP 頭,所以本文稱之為 SOAP 消息。
DB2 9.1 for z/OS® 增加了對 XML 數據類型的支持(稱為 pureXML),從而允許原生地存儲和索引 XML 數據。原生的 XML 支持意味著,XML 在存儲時就被解析了。維護有 XML 索引,因而可以通過 XPath 和 SQL/XML 查詢快速訪問存儲的 XML。此外,在 DB2 10.1 中(本文發表之時還處於 beta 版本),存儲的 XML 也可以通過 XPath 更新。
本文通過結合使用 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 管道配置文件
<?XML version="1.0" encoding="EBCDIC-CP-US"?>
<provider_pipeline XMLns="http://www.ibm.com/software/htp/cics/pipeline">
<service>
<terminal_handler>
<handler>
<program>WEBINST</program>
<handler_parameter_list/>
</handler>
</terminal_handler>
</service>
</provider_pipeline>
步驟 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
---------+---------+---------+---------+---------+---------+---------+---------+
....
---------+---------+---------+---------+---------+---------+---------+---------+
<?xml version="1.0" encoding="IBM285"?><soapenv:Envelope XMLns:soapenv="http://s
DSNT400I SQLCODE = 000, SUCCESSFUL EXECUTION
DSNT418I SQLSTATE = 01004 SQLSTATE RETURN CODE
DSNT415I SQLERRP = DSN SQL PROCEDURE DETECTING ERROR
DSNT416I SQLERRD = 0 0 0 -1 0 0 SQL DIAGNOSTIC INFORMATION
DSNT416I SQLERRD = X'00000000' X'00000000' X'00000000' X'FFFFFFFF'
X'00000000' X'00000000' SQL DIAGNOSTIC INFORMATION
DSNT417I SQLWARN0-5 = W,W,,,, SQL WARNINGS
DSNT417I SQLWARN6-A = ,,,, SQL WARNINGS
DSNE610I NUMBER OF ROWS DISPLAYED IS 1
DSNE612I DATA FOR COLUMN HEADER .... COLUMN NUMBER 1 WAS TRUNCATED
DSNE616I STATEMENT EXECUTION WAS SUCCESSFUL, SQLCODE IS 100
---------+---------+---------+---------+---------+---------+---------+---------+
---------+---------+---------+---------+---------+---------+---------+---------+
DSNE617I COMMIT PERFORMED, SQLCODE IS 0
DSNE616I STATEMENT EXECUTION WAS SUCCESSFUL, SQLCODE IS 0
---------+---------+---------+---------+---------+---------+---------+---------+
DSNE601I SQL STATEMENTS ASSUMED TO BE BETWEEN COLUMNS 1 AND 72
DSNE620I NUMBER OF SQL STATEMENTS PROCESSED IS 1
DSNE621I NUMBER OF INPUT RECORDS READ IS 1
DSNE622I NUMBER OF OUTPUT RECORDS WRITTEN IS 26
********************************************************** Bottom of Data ******
注意數據開始部分的 XML 聲明。它指出 XML 是 IBM285 (UK EBCDIC) 編碼類型的。關於它的重要性將在場景 2 中詳細介紹。
場景 2:查詢 pureXML 數據並返回 CICS Web 服務
此場景中的步驟展示如何創建一個 COBOL CICS 程序,它充當一個管道處理程序和服務提供程序,用於從 DB2 pureXML 列檢索 XML,並將之作為響應返回給 Web 服務調用。
步驟 1 — 創建 CICS 管道配置文件
將清單 6 中所示的 CICS 管道配置文件作為 /u/user/config/select_pipeline.XML 復制到 Unix System Services (USS)。該配置文件通知 CICS:名為 WEBSLCT 的定制管道處理程序將被用於處理 Web 服務請求。
清單 6. CICS 管道配置文件
<?XML version="1.0" encoding="EBCDIC-CP-US"?>
<provider_pipeline XMLns="http://www.ibm.com/software/htp/cics/pipeline">
<service>
<terminal_handler>
<handler>
<program>WEBSLCT</program>
<handler_parameter_list/>
</handler>
</terminal_handler>
</service>
</provider_pipeline>
步驟 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 消息形成一個可查詢的審計或應用程序日志。
本文示例源代碼或素材下載