CICS Web 服務支持在 CICS TS V3.1 中已變得可用。該特性使得 CICS 應用程序有可能成為服務請求者、服務提供者,或者兩者都是,可使用 HTTP 傳輸或 WebSphere? MQ 傳輸。Web 服務消息通常是 XML 形式的,且合并有 SOAP 頭,所以本文稱之為 SOAP 消息。有關 CICS Web 服務支持的更多信息,請參考本文末尾 參考資料 部分的適當鏈接。
DB2 9.1 for z/OS? 增加了對 XML 數(shù)據(jù)類型的支持(稱為 pureXML),從而允許原生地存儲和索引 XML 數(shù)據(jù)。原生的 XML 支持意味著,XML 在存儲時就被解析了。維護有 XML 索引,因而可以通過 XPath 和 SQL/XML 查詢快速訪問存儲的 XML。此外,在 DB2 10.1 中(本文發(fā)表之時還處于 beta 版本),存儲的 XML 也可以通過 XPath 更新。有關 DB2 pureXML 的更多信息,請參考本文末尾 參考資料 部分的適當鏈接。
本文通過結合使用 CICS 和 DB2 pureXML,展示如何使用 CICS Web 服務支持來存儲和檢索 SOAP 消息。場景簡要描述了連接 CICS Web 服務和 DB2 pureXML 后端之間的端到端所需的配置和部署。下載 部分提供了樣例代碼。樣例源代碼是用 COBOL 編寫的,但是將代碼轉(zhuǎn)換成 PL/I 或 C 編程語言會更直觀。
兩個場景共享相同的 CICS 區(qū)域,該區(qū)域運行的是 CICS TS 4.1。XML 數(shù)據(jù)存儲在 DB2 9.1 表中,其中包含單個 XML 類型的列。清單 1 包含創(chuàng)建該表的 SQL 代碼。
CREATE TABLE REDBOOK.PUREXML (SOAP XML) CCSID EBCDIC IN DATABASE REDBOOK; |
下載 部分的樣例代碼包含用于創(chuàng)建數(shù)據(jù)庫 STOGROUP、TABLESPACE 和 TABLE 的完整 SQL。
第一個場景展示,一個名為 WEBINST 的 COBOL CICS 程序(一個管道處理程序和服務提供程序)如何將其從 Web 服務接收的 XML 消息插入 DB2 pureXML 列中。第二個場景展示,一個名為 WEBSLCT 的 COBOL CICS 程序(也是一個管道處理程序和服務提供程序)如何從 DB2 pureXML 列中檢索 XML,并將之作為響應返回給 Web 服務調(diào)用。
場景 1:存儲通過 CICS Web 服務進來的數(shù)據(jù)
此場景中的步驟展示如何配置 CICS 區(qū)域,以接受入站 Web 服務請求并將 SOAP 有效負荷存儲在 DB2 中。為了簡化本例,以將注意力放在設置 Web 服務的機制上,這里將輸入消息作為 Web 服務的輸出消息返回。
本例不是使用 CICS 提供的管道處理程序(DFHWS2LS0)——它將 SOAP 數(shù)據(jù)(XML)轉(zhuǎn)換成二進制語言結構,而是使用一個定制的管道處理程序(名為 WEBINST)來接收 SOAP 消息并將之直接插入 DB2 中。這無需讓 CICS 解析 XML,因而改善了性能。
將清單 2 中所示的管道配置文件作為 /u/user/config/insert_pipeline.xml 復制到 UNIX? System Services (USS)。該配置文件通知 CICS,這個名為 WEBINST 的定制管道處理程序?qū)⒈挥糜谔幚?Web 服務請求。
<?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> |
在 CICS 區(qū)域中創(chuàng)建和安裝以下 CICS 資源:
以下資源是 DB2 所必需的,也可跟本文場景 2 中描述的 WEBSLCT 程序共享。
將清單 3 中所示的 COBOL 程序復制到 z/OS,并用集成的 DB2/CICS/COBOL 編譯器編譯它。下載 部分的樣例代碼包含樣例編譯作業(yè)。
****************************************************************** 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?)中創(chuàng)建一個項目,并將樣例代碼中的 SWITCH.wsdl 文件導入到項目中。
右鍵單擊樣例 WSDL 文件并選擇 Web Services > Test with Web Services Explorer,如圖 1 所示。
從 Endpoints 對話框(圖 2),使用 CICS TCPIPSERVICE 資源中指定的 TCP/IP 服務更新 URI 以指向您的 z/OS 映像,并單擊 Go。
在 Invoke a WSDL Operation 窗體(圖 3)的字段中輸入測試數(shù)據(jù),并單擊 Go。
Eclipse 基于您在窗體中輸入的數(shù)據(jù)產(chǎn)生一個 SOAP 消息,并將之發(fā)送到 CICS。CICS 將 SOAP 傳遞到步驟 1 中創(chuàng)建的 WEBINST 定制管道處理程序。WEBINST 將數(shù)據(jù)插入到名為 REDBOOK.PUREXML 的 DB2 表的 XML 列中。WEBINST 應用程序也返回初始的 SOAP 消息作為響應,如圖 4 中的 Web Services Explorer 屏幕截圖所示。
步驟 4 — 展示數(shù)據(jù)真正存儲在數(shù)據(jù)庫中
這最后一步證實數(shù)據(jù)被插入到了 DB2 表中。從一個諸如 DB2 SPUFI 之類的工具,執(zhí)行清單 4 所示的 SQL 語句。
SELECT * FROM REDBOOK.PUREXML |
清單 5 展示上面 SQL 語句返回的 DB2 數(shù)據(jù)。
---------+---------+---------+---------+---------+---------+---------+---------+ 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 ****** |
注意數(shù)據(jù)開始部分的 XML 聲明。它指出 XML 是 IBM285 (UK EBCDIC) 編碼類型的。關于它的重要性將在場景 2 中詳細介紹。
場景 2:查詢 pureXML 數(shù)據(jù)并返回 CICS Web 服務
此場景中的步驟展示如何創(chuàng)建一個 COBOL CICS 程序,它充當一個管道處理程序和服務提供程序,用于從 DB2 pureXML 列檢索 XML,并將之作為響應返回給 Web 服務調(diào)用。
將清單 6 中所示的 CICS 管道配置文件作為 /u/user/config/select_pipeline.xml 復制到 Unix System Services (USS)。該配置文件通知 CICS:名為 WEBSLCT 的定制管道處理程序?qū)⒈挥糜谔幚?Web 服務請求。
<?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> |
在 CICS 區(qū)域中創(chuàng)建和安裝以下資源:
對于此場景,可以重用在場景 1 中為 WEBINST 定義的 TCPIPSERVICE、DB2ENTRY 和 DB2TRAN 資源。
將清單 7 中所示的 COBOL 程序復制到 z/OS,并利用集成的 DB2/CICS/COBOL 編譯器編譯它。下載 部分的樣例代碼包含樣例編譯作業(yè)。
****************************************************************** 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
函數(shù)在 SQL 語句中被用于 SELECT
。這是為了讓 XML 聲明不被添加到返回的 XML 有效負荷的開頭。如果不帶 XMLSERIALIZE
使用 SELECT *
或 SELECT SOAP
,那么返回的 XML 在開頭部分將有一個 XML 聲明。此聲明宣稱 XML 被編碼在 CICS 系統(tǒng)的本地代碼頁。此本地代碼頁通常是一個 EBCDIC 代碼頁。在有些情況下,這會導致接收 XML 的應用程序由于不支持 EBCDIC 代碼頁而拒絕接收它。
將瀏覽器指向 WEBINST Web 服務的 URL。例如,在用于構建此場景的樣例案例中,此 URL 是:http://winmvsa1.hursley.ibm.com:12345/pureXML/select。
場景 1 中 WEBINST 程序插入的 SOAP 消息被檢索到并顯示在瀏覽器中,如圖 5 所示。
本文中描述的兩個場景所演示的例子有很多可能的變體。例子包括:
這些場景可以支持各種各樣的應用程序和服務,比如基于應用程序日志或窗體(例如,XHTML、XFORMS 或 Lotus Forms)的應用程序。
也可以確保 CICS Web 服務是安全的。本文末尾 參考資料 部分提供了到有關該主題詳細信息的鏈接。
本文演示了,從一個通過 CICS Web 服務調(diào)用的 CICS COBOL 應用程序,在 DB2 pureXML 中插入和檢索 XML 內(nèi)容的基本步驟。插入和檢索時無需在 CICS 應用程序中解析或構造 XML 數(shù)據(jù)。輸入的 XML 消息直接存儲在 DB2 中。輸出的 XML 消息是從查詢 DB2 中的 XML 數(shù)據(jù)創(chuàng)建的。使用 DB2 pureXML 作為存儲數(shù)據(jù)庫的 CICS Web 服務可以很容易變成大型分布式應用程序(例如,XML 窗體應用程序或消息傳遞應用程序)的一部分。pureXML 數(shù)據(jù)庫也可以為入站和出站 CICS Web Services XML 消息形成一個可查詢的審計或應用程序日志。
感謝 Maj-Britt Risager(及同事)和 Lars Andersen Hylleberg(及同事)審閱了本文并提供了反饋意見。