© Copyright International Business Machines Corporation 2003. All rights reserved.
引言
本文是 使用 WebSphere Studio Enterprise Developer V5 的 EGL 和 Struts ? 第 1 部分:生成 Java一文的續篇。在前一篇文章中,我們描述了 WebSphere®Studio Enterprise Developer V5 用來部署用 WebSphere Application Server V5 的企業生成語言(Enterprise Generation Language,EGL)編寫的應用程序的體系結構。我們使用了 Struts 框架作為模型,并描述了如何生成、測試并部署一個分為三層的應用程序,該應用程序由 Web 接口、WebSphere Application Server 和執行 DB2® 查詢來訪問數據庫的服務器程序組成。
在第 1 部分中,我們研究了如何用 EGL 來生成 Java™ 服務器程序。在第 2 部分中,我們將研究如何用 EGL 來生成在 z/OS® 上運行的 COBOL/CICS® 服務器程序,以及如何在 WebSphere Application Server V5 中配置 J2EE Connection Architecture(JCA Connector)。
在開始閱讀本文之前,我們希望您能按照第 1 部分的 下載說明把本文要用到的樣本程序裝入到 WebSphere Studio Enterprise Developer 中。
生成用于 z/OS 的 COBOL
在 z/OS 環境中,您可以使用 CICS 來部署服務器程序(Web 應用程序的第三層)。人們也常常希望這樣做,因為在 CICS 中大多數被服務器程序所調用的數據集和舊的代碼常常也是位于 z/OS 中。在這種情況下,COBOL 服務器程序的性能將比 Java 服務器程序更好。
對于我們的示例,您必須在 WebSphere Studio Enterprise Developer(以下簡稱 Enterprise Developer)中執行下列任務以創建并測試 COBOL/CICS 裝入模塊:
1. 創建并測試 EGL 程序文件
本(系列)文章的 第 1 部分描述了執行這個任務所涉及到的步驟(包括對 Struts 和 EGL 的介紹)。當您完成第 1 部分中的步驟 1.1 至步驟 3.3 后,再繼續執行下面的任務。
2. 創建用于生成 COBOL 代碼的構建描述符
如同我們在 第 1 部分中生成 Java 服務器程序時所做的那樣,我們現在必須創建相似的 EGL 構建描述符來支持 COBOL 的生成。
2.1 創建用于 COBOL 的構建描述符
cics-cobol
作為名稱。這樣 cics-cobol
部件就會被添加到 Outline 視圖中,并被打開以供編輯。 圖 1. 用于 COBOL/CICS 的構建描述符
指定選項的簡要描述:
選項 | 描述 |
Bind = coboldb2 |
DB2 必需的選項。綁定模板標識 z/OS 中用于 DB2 訪問的綁定控制部件;您將需要在晚些時候創建這個部件。 |
cicsEntries = RDO |
MVSCICS 可選的選項。當您生成 COBOL 程序時,該選項可指定是否要產生 CICS 定義;它將幫助 CICS 專家找出必須將哪些條目添加到 CICS PPT 中。 |
commentLevel = 1 |
該選項指定包含在生成的 COBOL 源代碼中的 EGL 注釋的級別;如果您在故障診斷時需要將 COBOL 源代碼與 EGL 源代碼對應起來,這很有用。 |
destHost | 運行目標構建服務器的機器的名稱;例如 carmvs1.raleigh.ibm.com 。 |
destPassword | 與 destUserID 對應的密碼。 |
destPort | z/OS 構建服務器的端口號;它必須與用來啟動 z/OS 構建服務器的作業中指定的端口號相匹配。 |
destUserID | 用于在 z/OS 上進行處理的用戶標識。 |
genDirectory | Enterprise Developer 放置生成的輸出文件和準備狀態文件的文件系統的位置;例如 c:\WSED\workspace\EGLgenout 。 |
prep = NO |
如果將它的值設置為 YES (缺省值),那么在成功完成生成(返回代碼 <= 4)時會自動啟動生成的對象的準備;源代碼將被發送至構建服務器以構建運行時對象。因為我們沒有與大型機連接,所以在我們的示例中指定了 NO 。(如果保留缺省值,所有的步驟都會執行,只是當嘗試連接大型機時會出現一條錯誤消息。) |
projectID | 將包含生成的代碼的 z/OS 分區數據集(partitioned data set,PDS)的高級限定符。Enterprise Developer 將使用這個限定符來定位適當的 z/OS 數據集。 |
sqlID | 在 SQL 語句的生成時驗證的過程中用來連接到 DB2 系統(在 z/OS 上)的用戶標識。例如 db2admin 。 |
sqlPassword | 與 sqlID 對應的密碼。 |
System = MVSCICS |
生成的源代碼的目標系統。當前可用的選項只有 MVSCICS (用于 z/OS)。 |
targetNLS = ENU |
用于運行時輸出的目標本地語言代碼。至關重要的一點是,您必須安裝指定語言的 Enterprise Developer Server,尤其是在那些所用語言不是英語的國家和地區更是如此,因為顯示給最終用戶的各種消息都將基于這種指定的語言。例如,如果是在巴西,這個參數就應該是 PTB 。如果將它設置為 ENU (缺省值),那么最終用戶所看到的消息就將是用美國英語來表示的。 |
2.2 為 COBOL 的 Java 包裝程序創建構建描述符
就像我們在 第 1 部分中為 Java 服務器程序所做的那樣,COBOL 服務器程序也將需要一個 Java 包裝程序。Java 包裝程序是一個類的集合,它充當 servlet(或 Java 程序)和由 EGL 生成的 COBOL 程序之間的接口。因為 Java 包裝程序將使用不同的鏈接規范,所以我們需要為它創建另一個構建描述符。
wrapper-cobol
。 圖 2. 用于 COBOL/CICS 的 Java 包裝程序
生成的 Java 代碼將被創建在 EGLWeb
項目中的 eglweb.java.cics
包中。這樣就能保護為 Java 服務器程序創建的 Java 包裝程序,使我們可以不必重新生成代碼,而只要改變 Struts Action 類的 import 語句就可以在 Java 或 COBOL 服務器上進行測試。
3. 創建 DB2 綁定控制部件
綁定控制部件提供了一種在綁定控制文件中存儲信息的方法,該文件隨后指定在準備期創建的 DB2 規劃中要包含哪些數據庫請求模塊(database request module,DBRM)。只有當您要生成在訪問 DB2 的 SQL 表的 z/OS 上運行的 COBOL 程序時綁定控制部件才有意義,而我們正是要這樣做。這里的綁定控制文件和您從本地 COBOL 程序訪問 DB2 時要創建的綁定控制文件一樣。在 EGL 的上下文中,綁定控制文件是分布式構建函數的輸入,用于為執行準備生成的源代碼。
要創建綁定控制部件:
coboldb2
作為名稱。這樣 coboldb2
部件就會被添加到 Outline 視圖中,并被打開以供編輯。 圖 3. DB2 綁定控制部件
4. 創建用于 COBOL/CICS 的鏈接部件
鏈接部件定義了生成的 Java 包裝程序應該如何調用被調用的 EGL 程序,對本文來說就是使用 CICS。對于生成的 COBOL 程序,在生成時指定的鏈接選項會在運行時起作用。要創建鏈接部件:
linkageTE01A-cics
。 我們在示例中使用的選項如圖 4 所示。
圖 4. 用于 COBOL 生成的鏈接部件
指定選項的簡要描述:
選項 | 描述 |
pgmName = TE01A |
CallLink 元素指向的程序部件的名稱。 |
type = remoteCall |
指出調用使用了 EGL 中間件,它在被傳送數據的尾部添加了 12 個字節,使得調用者能從被調用程序那里接收到一個返回值??赡艿倪x項還有 localCall 和 ejbCall 。 |
conversionTable = CSOE037 |
用于轉換調用的數據的轉換表的名稱。 CSOE037 是用于英語或葡萄牙語的表,其他語言需要使用不同的表。 |
location = eis/CICSResourceAdapter |
指定如何在運行時確定被調用程序的位置。因為我們使用 CICSJ2C 作為 remoteComType,所以它指的是 ConnectionFactory 對象的 JNDI 名稱,而該對象是您在設置 J2EE 服務器時為被調用的 CICS 事務建立的。根據約定,ConnectionFactory 對象的名稱以 eis/ 開頭。 |
luwControl = SERVER |
指出工作單元是由 caller () 來控制,還是由被調用程序來控制。 SERVER 意味著由被調用程序啟動的工作單元獨立于任何由調用程序控制的工作單元。 |
parmForm = COMMDATA |
指出調用者會把數據存放在 COMMAREA 中,而不是從外部指向數據。這樣就可以不用關心邊界對齊而將每個參數值都移至緊接著前一個值的緩沖區。 |
remoteBind = GENERATION |
指出調用所要用到的屬性是在生成時設置的。 |
remoteComType = CICSJ2C |
指定所用的通信協議。WebSphere 使用 J2C 連接器,但為了 J2EE 實現,我們必須使用 CICSJ2C 。其他可能的選項有 CICSECI 、 DIRECT 和 TCPIP 。 |
remotePgmType = EGL |
指定被調用程序是用 Enterprise Developer EGL 語言生成的 COBOL 程序。另一個選項是 NATIVE。 |
5. 生成 COBOL/CICS 服務器程序
要生成 COBOL 服務器程序:
TE01A.eglpgm
并選擇 Generate EGL With => Target System and Java Wrapper Build Descriptors調用生成向導。 wrapper-cobol (EGLWeb/Java Source/TE01ABuild.eglbld)
cics-cobol (EGLWeb/Java Source/TE01ABuild.eglbld)
EGLWeb/Java Source/eglweb/java/cics
文件夾中會生成用于 COBOL/CICS 的 Java 包裝程序(比如 Te01aWrapper.java
和 Te01w01.java
)。這樣就能保護用于 Java 服務器的包裝程序,因為別的包裝程序是存儲在不同的文件夾( EGLWeb/Java Source/eglweb/java
)中的。而對于測試,您將只需要改變導入的類以使它們指向正確的文件夾就可以了。 Te01aWrapper.java
。要在執行 COBOL 調用的方法調用中使用的 callOptions 變量如圖 5 和圖 6 所示。 Te01aWrapper.java
擴展了由 Enterprise Developer 提供的 CSOServerProgram
。 Te01w01.java
,它將在調用包裝程序時被作為一個參數來使用。 圖 5. Te01aWrapper 類中的 callOptions 變量
圖 6. Te01aWrapper 類中的方法調用
C:\WSED\workspace\EGLgenout
目錄中。在晚些時候,所有這些組件都必須被提交給 z/OS 以用于 COBOL 服務器程序的準備和編譯。
圖 7. 用于 COBOL/CICS 的生成的組件
6. 更新 Struts Action 類以調用 COBOL
在 eglweb.java.cics
包中生成用于 COBOL 的 Java 包裝程序是為了保護 Java 服務器程序的包裝程序。要使 InquiryAction 類調用 COBOL 服務器(而不是 Java 服務器),您需要做如圖 8 所示的改變。
圖 8. 改變 Inquiry Action Java
我們的通過 JCA 連接器來使用 CICS 的樣本應用程序的簡化圖表如圖 9 所示。
圖 9. 使用 CICS 作為服務器
clearcase/" target="_blank" >cc">
CICS 事務處理網關(CICS Transaction Gateway,CTG)是一個關鍵的 CICS 組件,您可以在應用程序的開發和運行時過程中用它來測試 CICS 調用。CTG 提供本地協議(直接到 CICS)和網絡協議(比如 TCP 和 SSL)用于和 CTG 服務器(CTG Server)進行通信,而 CTG 服務器指導對 CICS 服務器的調用。本文假設您已經接觸過 CICS 事務處理網關,V4.01 或更高版本。有關 CTG 的進一步的詳細信息超出了本文的范疇,但如果您想要了解更多詳細信息,可以參考題為 CICS Transaction Gateway V5 - The WebSphere Connector for CICS 的 IBM 紅皮書(請參閱 相關信息)。 |
運行應用程序
至此,您已經創建了所有的 COBOL 服務器代碼和 Java 包裝程序?,F在,您必須把大型機組件提交給大型機以創建可執行文件,而且必須正確配置 WebSphere Application Server 以通過 JCA 連接器(它調用 CICS COBOL 程序)來運行應用程序。
現在,您必須執行下列任務以準備并運行應用程序:
1. 提交為大型機的準備而生成的 COBOL 程序
當您生成 COBOL 程序、Java 程序或 Java 包裝程序時,EGL 都會產生一個構建規劃(除非您將構建描述符中的 buildPlan 選項設置為 NO
)。Enterprise Developer 把這個生成的構建規劃(在我們的示例中就是 TE01ABuildPlan.xml
)用作為運行時準備生成的輸出這一步的輸入。
因為我們并不期望在生成時連接到大型機,所以我們在 COBOL 生成選項中指定 prep = NO
以阻止構建規劃被啟動?,F在,要調用構建規劃,請執行下列步驟(如果您將 prep 選項設置為 YES
,下列步驟就不是必需的):
2. 配置 CICS 的 Web 應用程序
JCA 連接工廠提供了到 CICS 的連接。您必須指定資源適配器在連接到特定的 CICS 實例時所需的全部信息,同時還需指定 JNDI 查找名稱,使得組件能通過它使用新的連接工廠實例。有了這個查找名稱,組件就能快速地連接到 CICS。然后在運行時,工廠對象就能生成一個連接、定位 CICS 服務器并調用服務器上的 CICS 程序。
當我們定義了鏈接部件,就要在 CallLink 元素中指定 eis/CICSResourceAdapter
的位置值。因為這個值是一個局部 JNDI 名稱,所以我們不得不將它映射為一個全局 JNDI 名稱。要綁定 JNDI 名稱:
/WEB-INF
Web 內容中)的 web.xml
部署描述符。 eis/CICSResourceAdapter
eis/CICSERV
圖 10. JCA 的資源引用
3. 在 WebSphere Application Server 中安裝 CICS ECI 資源適配器
CICS ECI(External Call Interface,外部調用接口)資源適配器可以訪問服務器上的 CICS 事務。Enterprise Developer 不會在產品安裝過程中自動裝入 ECI 資源適配器。因此您需要為每個用戶工作空間都執行一次這個活動。
要查看您的 Enterprise Developer 工作空間中是否已經安裝了 CICS ECI 資源適配器(如果有必要,您需要在隨后導入它):
圖 11. 檢查是否導入了 CICS ECI 資源適配器
cicseci.rar
。您可以在 WSED\resource_adapters
中找到 WebSphere Studio 所帶的 JCA 資源適配器,其中 WSED
是安裝 WebSphere Studio 的目錄。 4. 為 WebSphere 測試環境創建資源適配器并配置連接工廠
應用程序組件是用連接工廠(而不是直接用資源適配器)來訪問連接實例。連接的示例包括數據庫連接、JCA、Java 消息服務(Java Message Service)連接和 SAP R/3 連接。連接工廠實際上是一個配置屬性列表持有者。除了資源適配器供應商定義的配置屬性的任意集之外,還有幾個標準配置屬性可以應用到連接工廠上。JCA 連接池管理器會在應用程序服務器運行時使用這些標準屬性。
在 第 3 節中,我們將資源適配器裝入了工作空間中?,F在,我們必須要創建資源適配器并配置連接工廠,我們會在運行時執行中用到它們。這一步和訪問數據庫所需的數據存儲配置很相似。(在第 1 部分中, 第 7.1 節中有類似步驟的執行。)
在下面的步驟中,您將把連接工廠添加到您的包含了資源適配器在連接到特定 CICS 實例時所需信息的服務器配置中。您將指定 Java 命名和目錄接口(Java Naming and Directory Interface,JNDI)查找名稱,使得組件能通過它使用新的連接工廠實例,從而使組件能快速地連接到 CICS。在運行時,工廠對象將使用這一信息來生成連接、定位 CICS 服務器并調用服務器上的 CICS 程序。
要創建資源適配器,打開服務器配置,選擇 J2C頁面,然后選擇 Add,如圖 12 所示。
這里,我們假設您已經定義了 WebSphere 服務器和服務器配置。要創建資源適配器,打開服務器配置,選擇 J2C頁面,然后選擇 Add,如圖 12 所示。選擇 Enter關閉窗口。如果 Add 按鈕不是活動的,可能是因為在步驟 3 中沒有正確地裝入 RAR 文件。
圖 12. 安裝 CICS ECI 資源適配器
4.1 定義 JCA 用法的安全性
WebSphere Application Server V5 完全支持 Java 認證和授權服務(Java Authentication and Authorization Service,JAAS)體系結構并擴展了訪問控制體系結構以支持 J2EE 資源的基于角色的授權。安全性是可選的。要使用 JAAS 認證來約束對事務的訪問,您需要把 JAAS 認證條目添加到服務器配置中:
圖 13. 定義 JCA 的認證
4.2 創建 JCA 連接工廠
現在,我們必須配置 JCA 的連接工廠:
CICSERV
(CICS 服務器名稱) eis/CICSERV
(它和 Web 應用程序相匹配) 圖 14. 連接工廠定義
4.3 定義連接工廠的屬性
使用 Resource Properties 窗口,通過將配置對話框中每個屬性的值改為如下所示的值來定義連接工廠的各屬性(如圖 15):
CICSERV
(CICS 服務器的名稱) tcp://carmv1.raleigh.ibm.com
(z/OS 機器,在構建描述符的 destHost 中也有定義) 22002
(CICS 事務網關的端口) TE01
(運行 DB2 規劃的 CICS 事務的名稱) 圖 15. 連接工廠屬性
5. 測試 COBOL/CICS 事務
在測試之前,您必須完成下列與環境有關的任務,其中大部分是任何運行 CICS 事務的 z/OS 環境的典型任務:
在您設置完環境后,就可以進行測試了:
您可能遇到的異常錯誤將涉及到一些 CICS 配置元素。錯誤消息將提供給您一些信息,但為了能更好地理解,您可能需要查看存儲在 z/OS 中的 CICS 日志消息。例如,如果機器無法訪問指定的 z/OS IP 地址,您會接收到一條如下所示的消息:
不要感到沮喪,因為像這樣的錯誤一般是由 CTG 或 CICS 配置問題所引起的,所以您不需要對生成的服務器程序組件做任何編碼上的改變。
結束語
祝賀您!您沒有編寫一行 Java 或 COBOL 代碼,就實現了一個使用了 STRUTS 的應用程序,并用 JCA Connector 完成了它與 CICS 的連接。您完全可以把這個非常簡單的應用程序擴展為一個相當高級的、復雜的應用程序,但它們的編碼、測試和調試的過程卻是十分相似的。
當開發人員在 EGL 中進行編碼時,他們并不需要應付所有的細節問題,因為 EGL 會生成所有的連接器以使用必需的 Java 類,而這些 Java 類會在生成時可用。EGL 為程序員提供了一種簡單的方式,使得他們即使不具備實現 J2EE 通常所必需的所有技能,也能夠進入復雜的 J2EE 世界。
原文轉自:http://www.anti-gravitydesign.com