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