Apache Geronimo 服務(wù)器的最新版本 M5(即 Milestone 5,參見 參考資料 中的鏈接),使用 CORBA 對與外部系統(tǒng)的互操作性進(jìn)行了改進(jìn)。如果您曾經(jīng)接觸過 CORBA,就會明白這種能力的重要意義,以及在特定項(xiàng)目中對 J2EE 服務(wù)器生存能力的影響。
CORBA 不但是很多遺留計算系統(tǒng) —— 從大型機(jī)到超級計算機(jī) —— 選擇的外部接口機(jī)制,還作為一種分布式對象機(jī)制被大型的實(shí)時控制至關(guān)重要的電信業(yè)、銀行業(yè)和國防系統(tǒng)廣泛采用。這些系統(tǒng)中,很多時候需要訪問 J2EE 服務(wù)器域中管理的信息和業(yè)務(wù)邏輯(或者相反)。要平穩(wěn)地實(shí)現(xiàn)這種訪問,而且不需要復(fù)雜的自定義編碼,CORBA 和 J2EE 組件之間的互操作性是最基本的要求。
Geronimo 的 CORBA 互操作實(shí)現(xiàn)允許 CORBA 客戶機(jī)應(yīng)用程序訪問 Enterprise JavaBeans? (EJB) 中包含的業(yè)務(wù)邏輯和 J2EE 業(yè)務(wù)層管理的數(shù)據(jù)。
本文示范了如何利用 Geronimo M5 的 CORBA 互操作能力。提供了一個完整的 CORBA 客戶機(jī)訪問 Geronimo 服務(wù)器管理的業(yè)務(wù)層 EJB 的例子。客戶機(jī)利用了 Geronimo 客戶機(jī)應(yīng)用程序容器提供的支持。
CORBA 為分布式對象間的交互提供了基于標(biāo)準(zhǔn)的基礎(chǔ)設(shè)施。它允許運(yùn)行在不同硬件、不同操作系統(tǒng)上用不同編程語言編寫的軟件組件通過網(wǎng)絡(luò)進(jìn)行通信、協(xié)作和執(zhí)行生產(chǎn)性任務(wù)。
CORBA 系統(tǒng)通過將對象之間的交互定義為明確的接口完成了這一不可思議的任務(wù)。要使用分布式對象的服務(wù),必須通過接口與之交互??蛻魴C(jī)不知道,也不需要知道接口是如何實(shí)現(xiàn)的,甚至是在何處實(shí)現(xiàn)的。圖 1 說明了典型的 CORBA 系統(tǒng)的工作方式。
圖 1. CORBA 中的對象交互
在 圖 1 中,客戶機(jī)代碼通過接口使用服務(wù)器對象。事實(shí)上,接口是通過客戶機(jī)本地的存根對象實(shí)現(xiàn)的。對客戶機(jī)來說,它僅僅與本地的存根對象交互。在幕后,存根對象實(shí)現(xiàn)了和遠(yuǎn)程服務(wù)器對象同樣的接口??蛻魴C(jī)調(diào)用接口方法時,存根對象將調(diào)用轉(zhuǎn)發(fā)給稱為Object Request Broker (ORB) 的 CORBA 組件。客戶機(jī)的調(diào)用代碼不需要知道調(diào)用實(shí)際上是通過存根進(jìn)行的。
ORB 是 CORBA 基礎(chǔ)設(shè)施的關(guān)鍵一環(huán)。它負(fù)責(zé)本地化服務(wù)器對象(無論是否通過網(wǎng)絡(luò))然后把存根的調(diào)用發(fā)送到服務(wù)器。調(diào)用完成后,返回值通過網(wǎng)絡(luò)返給 ORB,ORB 再交給存根。然后存根返回給客戶機(jī)調(diào)用。對于客戶機(jī)而言,存根對象就是接口的實(shí)現(xiàn)者。
在服務(wù)器端,ORB 也有重要的作用。它必須接收來自客戶機(jī) ORB 的方法調(diào)用,并轉(zhuǎn)發(fā)給基干(skeleton)對象,后者和客戶端的存根直接對應(yīng)。從服務(wù)器邏輯的角度來看它隱藏了網(wǎng)絡(luò)調(diào)用,即實(shí)現(xiàn)了接口?;蓪ο髮Ψ?wù)器機(jī)器上實(shí)現(xiàn)接口的對象進(jìn)行服務(wù)器端本地調(diào)用。
不同 ORB 實(shí)現(xiàn)進(jìn)行通信的需要
ORB 的具體實(shí)現(xiàn)細(xì)節(jié)因廠商而異。對于一家廠商來說,ORB 實(shí)現(xiàn)可能作為鏈接到客戶機(jī)/服務(wù)器可執(zhí)行文件的庫實(shí)現(xiàn)。另一家則可能是庫代碼層和運(yùn)行在同一機(jī)器上的守護(hù)進(jìn)程之間的協(xié)作。無論如何,不同廠商的 CORBA ORB 都能夠互相對話,這要感謝 CORBA Internet 通信協(xié)議 Internet InterORB Protocol (IIOP) 的標(biāo)準(zhǔn)化。圖 1 說明了 ORB 通過 IIOP 通信的情況。
IIOP 是 General Inter-ORB Protocol (GIOP) 在 Internet TCP/IP 網(wǎng)絡(luò)上的規(guī)范。從 CORBA 2.0 開始,該規(guī)范就要求不同廠商的 ORB 必須能夠一起工作。目前,IIOP 廣泛用于實(shí)現(xiàn)不同 ORB 實(shí)現(xiàn)之間、Java Remote Method Invocation (RMI) 和 CORBA 系統(tǒng)之間的互操作。
在 Java Development Kit (JDK) 1.4 及以后的版本中,可以選擇使用 IIOP 協(xié)議在 Java RMI 對象之間通信。過去,只有私有的 Java Remote Messaging Protocol (JRMP) 用于 RMI。JRMP 和 IIOP 都用于通過網(wǎng)絡(luò)發(fā)送消息調(diào)用信息或者返回數(shù)據(jù)。RMI 對象能夠使用 IIOP 意味著基于 Java 的 RMI 客戶機(jī)可以訪問 CORBA 遠(yuǎn)程對象,CORBA 客戶機(jī)也可以訪問 RMI 實(shí)現(xiàn)的對象。對于讓 Java 對象能夠訪問遺留的基于 CORBA 的資源,以及讓其他 CORBA 客戶機(jī)訪問開放的 Java 服務(wù)器資源(如 EJB),這種互操作非常重要。
CORBA IDL —— 基于接口的遠(yuǎn)程對象訪問
CORBA 系統(tǒng)中的對象完全通過接口來訪問。在 CORBA 中,接口用一種標(biāo)準(zhǔn)格式 Interface Definition Language(接口定義語言,IDL)來定義,IDL 獨(dú)立于具體的編程語言。圖 2 說明了 IDL 如何將服務(wù)器對象和客戶機(jī)結(jié)合在一起。
圖 2. 從 IDL 生成存根和基干
對于支持的每種編程語言,都提供了生成原生語言綁定的工具。綁定 通常是用支持的編程語言生成的源代碼(如 Java 綁定是 Java 代碼,C++ 綁定是 C++ 源代碼)。生成的代碼然后被編譯,并與客戶機(jī)和源代碼鏈接在一起。雖然綁定是文本源代碼文件,與大多數(shù)生成的代碼一樣很容易修改,但是千萬不要這么做,因?yàn)橹匦律珊髸宄羲械男薷摹I傻拇a包括客戶端的存根(實(shí)現(xiàn)必要的接口)和服務(wù)器端的基干。還包括一些必要的 helper 方法,用于實(shí)現(xiàn)相應(yīng)編程語言數(shù)據(jù)類型間的轉(zhuǎn)換。
CORBA 體系結(jié)構(gòu)提出了對象總線(object bus)的概念。通過 ORB 連接到該總線的任何客戶機(jī)或服務(wù)器實(shí)現(xiàn)都可以交互和使用一組明確定義的、標(biāo)準(zhǔn)化的 CORBA 服務(wù)。圖 3 解釋了 CORBA 總線。
圖 3. CORBA 對象總線
圖 3 中,服務(wù)包括命名服務(wù)器、接口存儲庫(用于存儲和檢索接口及類型描述)和時間服務(wù)。
CORBA 中經(jīng)常使用命名服務(wù)。對象管理組(即 OMG,請參閱 參考資料 中的 OMG 鏈接)規(guī)定了一種 Interoperable Naming Service (INS)。這種思想非常簡單,與 RMI 類似。簡而言之,服務(wù)器創(chuàng)建遠(yuǎn)程可訪問對象的實(shí)例,使用 ORB 綁定它來接收發(fā)來的請求,然后使用眾所周知的或者廣為宣傳的文本名將該實(shí)例的可用性注冊到命名服務(wù)器。需要使用服務(wù)器上的服務(wù)的任何客戶機(jī)都能夠與命名服務(wù)聯(lián)系,使用文本名稱查找服務(wù)器來獲得遠(yuǎn)程對象引用。
用 Java 編程語言編寫代碼時,J2EE 和 Java Naming and Directory Interface (JNDI) 的集成允許開發(fā)人員編寫可處理不同目錄和命名服務(wù)的對象查找代碼。客戶機(jī)代碼調(diào)用 JNDI,JNDI 在底層通過提供程序?qū)崿F(xiàn)轉(zhuǎn)發(fā)到可用的服務(wù)。JDK 中提供了 CosNaming 提供程序,允許 JNDI 代碼使用 CORBA 命名服務(wù)查找對象。圖 4 說明了使用 JNDI 查找遠(yuǎn)程 CORBA 對象。
圖 4. 基于 JNDI 的 CORBA 查找
圖 4 還表明,與基于 JNDI 的 CORBA 查找一起使用時,RMI-IIOP 很容易讓開發(fā)人員編制一個能同時用于 RMI 和 CORBA 服務(wù)器的代碼庫。
Geronimo 的 CORBA 互操作實(shí)現(xiàn)
有了這些基本的了解后,現(xiàn)在可以看看如何實(shí)現(xiàn) Geronimo 與外部 CORBA 客戶機(jī)和組件的互操作了。圖 5 顯示了常見的幾種互操作。其中包括:
- Web 層或 EJB 層 Java 客戶機(jī)調(diào)用外部 CORBA 組件的方法。
- 通過 IIOP 公開的在 Geronimo 服務(wù)器中運(yùn)行的 EJB 組件供基于 CORBA 的客戶機(jī)遠(yuǎn)程訪問。
- 應(yīng)用程序客戶機(jī)使用 Geronimo 客戶機(jī)應(yīng)用程序容器訪問遠(yuǎn)程 CORBA 組件。
上述情況下,Geronimo 中的客戶機(jī)或服務(wù)器代碼都必須通過 IIOP 和 ORB 與外部 CORBA 組件通信。JDK 標(biāo)準(zhǔn)發(fā)行版帶有 Sun Microsystems 的 ORB 實(shí)現(xiàn),常常被稱作 Sun ORB。Geronimo M5 利用這種 ORB 進(jìn)行互操作。
圖 5. Geronimo CORBA 互操作場景
使用 Geronimo,在部署的時候通過配置可以將 EJB 公開為 CORBA 服務(wù)器。這就是說 EJB 中不需要任何特殊的代碼。事實(shí)上,任何已有的 EJB 都能公開為 CORBA 服務(wù)器對象。
我們的例子中,一個簡單的無狀態(tài)會話 bean 公開了一個方法來讀取服務(wù)器端的時間戳。EJB 接口的代碼如 清單 1 所示。
清單 1. 服務(wù)器時間戳無狀態(tài)會話 EJB 的 EJB 接口
| package com.ibm.dw.geronimo.corba;
public interface ServerTimestamp extends javax.ejb.EJBObject {
	public String getTimestamp() throws java.rmi.RemoteException;
}
 | 
該 EJB 接口的具體實(shí)現(xiàn)在 com.ibm.dw.geronimo.corba.ServerTimestampImpl 類中,如 清單 2 所示。
清單 2. 服務(wù)器時間戳 EJB 的實(shí)現(xiàn)
| package com.ibm.dw.geronimo.corba;
import java.util.Date;
public class ServerTimestampImpl implements javax.ejb.SessionBean {	
	public String getTimestamp(){
		return "This is the current server time " + new Date();
	}
	private javax.ejb.SessionContext mySessionCtx;
	public javax.ejb.SessionContext getSessionContext() {
		return mySessionCtx;
	}
	public void setSessionContext(javax.ejb.SessionContext ctx) {
		mySessionCtx = ctx;
	}
	public void ejbCreate() throws javax.ejb.CreateException {
	}
	public void ejbActivate() {
	}
	public void ejbPassivate() {
	}
	public void ejbRemove() {
	}
}
 | 
注意,清單 1 和 清單 2 中都沒有特殊的 CORBA 代碼。事實(shí)上,即便 EJB 的部署描述符也非常普通。清單 3 顯示了時間戳 EJB 的部署描述符 ejb-jar.xml。
清單 3. 服務(wù)器時間戳 EJB 的部署描述符 ejb-jar.xml
| <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 
'http://java./dtd/ejb-jar_2_0.dtd'>
<ejb-jar>
  <enterprise-beans>
      <session>
          <display-name>Server timestamp Stateless Session Bean</display-name>
          <ejb-name>ServerTimestampEJB</ejb-name>
          <home>com.ibm.dw.geronimo.corba.ServerTimestampHome</home>
	    <remote>com.ibm.dw.geronimo.corba.ServerTimestamp</remote>
          <ejb-class>com.ibm.dw.geronimo.corba.ServerTimestampImpl</ejb-class>
          <session-type>Stateless</session-type>
          <transaction-type>Container</transaction-type>
      </session>
   </enterprise-beans>
</ejb-jar>
 | 
清單 3 中普普通通的 ejb-jar.xml 可以讓 EJB JAR 不需要修改就能部署在 Geronimo 或其他 J2EE 1.4 服務(wù)器上。
為了配置 EJB 讓 CORBA 訪問,需要為其創(chuàng)建一個專門的 Geronimo 部署計劃。部署計劃包含在 dp.xml 文件中。清單 4 顯示了該計劃文件的一部分,設(shè)置 EJB 以供 CORBA 客戶機(jī)訪問。
清單 4. 配置服務(wù)器時間戳 EJB 供 CORBA 訪問
| <?xml version="1.0" encoding="UTF-8"?>
<application
    xmlns="http://geronimo./xml/ns/j2ee/application-1.0"
    configId="com/ibm/dw/geronimo/corba/ServerTimestamp"
    parentId="org/apache/geronimo/ServerCORBA">
    <import>
        <uri>org/apache/geronimo/Security</uri> 
    </import>
    <module>
        <ejb>dwcorba1-ejbs.jar</ejb>
        <openejb-jar
            xmlns="http://www./xml/ns/openejb-jar-2.0"
            configId="ServerTimestampEJB"
            parentId="org/apache/geronimo/ServerCORBA">
            <enterprise-beans>
                <session>
                    <ejb-name>ServerTimestampEJB</ejb-name>
                    <jndi-name>ServerTimestampEJB</jndi-name>
                     <tss-link>IdentityTokenNoSecurity</tss-link> 
                </session>
            </enterprise-beans>
        </openejb-jar>
    </module>
...   
 | 
清單 4 中可以看到,我們把部署的 .ear 文件的父配置設(shè)為 org/apache/geronimo/ServerCORBA 配置。該配置文件包括標(biāo)準(zhǔn)org/apache/geronimo/Server 配置的全部內(nèi)容,還有一些 CORBA 專用服務(wù)器端 GBeans 的定義。<tss-link> 元素用屬性值IdentityTokenNoSecurity 指定了安全處理 GBeans 中的一個。下一節(jié)介紹該 GBean 的操作。
CORBA 2.3 CSIv2 安全需求的 GBean 實(shí)現(xiàn)
Geronimo 的 CORBA 實(shí)現(xiàn)和完全遵循 CORBA 2.3。CORBA 2.3 要求實(shí)現(xiàn)一個安全層,稱為 Common Security Interoperability, Version 2 (CSIv2)。在通信之前,該層在 CORBA 客戶機(jī)和服務(wù)器之間協(xié)商需要的安全級別。(在以后的文章中再詳細(xì)討論 CSIv2 的細(xì)節(jié)。)
Geronimo M5 中,CSIv2 特性是作為一組 GBean 實(shí)現(xiàn)的,可以在將 EJB 公開為 CORBA 訪問時配置。
清單 4 中,<tss-link> 選擇了一種 Target Security Service (TSS) 實(shí)現(xiàn) GBean。它選擇的是 IdentityTokenNoSecurity,這部署在 org/apache/geronimo/ServerCORBA 部署計劃中,以允許不通過身份驗(yàn)證或加密來進(jìn)行訪問。
公開 EJB 供 CORBA 訪問需要做的配置就這么簡單。父配置 org/apache/geronimo/ServerCORBA 在模塊啟動時啟動 CORBA 命名服務(wù)并將該 EJB 注冊為可用的 CORBA 服務(wù)器對象。
創(chuàng)建基于 Swing 的 CORBA 客戶機(jī)應(yīng)用程序
要作為 CORBA 對象訪問 EJB,需要創(chuàng)建一個簡單的 GUI 客戶機(jī)應(yīng)用程序,運(yùn)行在 Geronimo 應(yīng)用程序客戶機(jī)容器中。該客戶機(jī)的源代碼組件如表 2 所示??梢愿鶕?jù)代碼發(fā)行版交叉參考該表。
| 代碼組件 | 說明 | 
|---|---|
| TimestampDisplayClient.java | 客戶機(jī)應(yīng)用程序的主類,非常簡單,構(gòu)造 TimestampFrame 的實(shí)例并顯示它。 | 
| TimestampFrame.java | JFrame 子類,使用 JDK 內(nèi)置的 RMI-IIOP 訪問遠(yuǎn)程 CORBA 服務(wù)器時間戳對象。它從遠(yuǎn)程 CORBA 服務(wù)器獲得時間戳然后顯示在自己的 Swing GUI 中。 | 
| SecurityCallbackHandler.java | Client Security Service (CSS) 處理 GBean 調(diào)用該處理程序。當(dāng)服務(wù)器需要用戶名和口令進(jìn)行身份驗(yàn)證時,該處理程序通常顯示一個用戶界面來收集這些信息。這里的例子沒有使用這個處理程序。 | 
| com.ibm.dw.geronimo.corba.ServerTimestamp.class com.ibm.dw.geronimo.corba.ServerTimestampHome.class | 正確地編譯 TimestampFrame.java 需要這些 EJB Java 類文件。 | 
TimestampFrame.java 的源代碼如 清單 5 所示。這是調(diào)用遠(yuǎn)程 EJB/CORBA 對象方法的具體類。
清單 5. TimestampFrame.java 中的 RMI-IIOP 調(diào)用
| package com.ibm.dw.geronimo.corba.client;
import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import com.ibm.dw.geronimo.corba.ServerTimestampHome;
import com.ibm.dw.geronimo.corba.ServerTimestamp;
public class TimestampFrame extends JFrame{
	public TimestampFrame(String title) {
		super(title);
	}
	public void init() {
		JLabel timeStamp = new JLabel(getTime());
		JPanel pane = new JPanel();
		pane.setLayout(new BorderLayout());
		pane.add(timeStamp, BorderLayout.CENTER);
		this.getContentPane().add(pane);
	}
	private String getTime() {
	  String retval = "";
		ServerTimestamp ts = null;
		try {
		Context ic = new InitialContext();
			Object o = 
                ic.lookup("java:comp/env/ServerTimestampEJB");
			 ServerTimestampHome home = (ServerTimestampHome)
			 PortableRemoteObject.narrow(o, 
                  ServerTimestampHome.class);
		    ts = home.create();
		    retval = ts.getTimestamp();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return retval;
	}
	
}
 | 
清單 5 中,使用 InitialContext 通過 JNDI 查找來獲得對象引用。得到的對象引用使用 PortableRemoteObject.narrow() 縮小轉(zhuǎn)換為 EJB Home 接口。該代碼可以通過 IIOP 訪問遠(yuǎn)程 CORBA 對象和遠(yuǎn)程 RMI 對象。
與使用 IDL 生成的常規(guī) Java 綁定(源代碼)不同,Geronimo 可以動態(tài)生成二進(jìn)制形式的 CORBA 存根??蛻魴C(jī)應(yīng)用程序會利用這種動態(tài)存根生成能力;存根是在請求 ORB 時生成的。
圖 6 顯示了對應(yīng)用程序客戶機(jī)和服務(wù)器端 EJB 可用的 Geronimo CORBA 支持。
圖 6. Geronimo 的 CORBA 支持
應(yīng)用程序客戶機(jī)的部署計劃中,配置了一個處理 CSIv2 客戶端的 GBean,稱為 CSS。deploy.xml 文件指定了和 NosSecurity 名關(guān)聯(lián)的 CSS 實(shí)例。清單 6 說明了應(yīng)用程序客戶機(jī)需要的配置。
清單 6. 配置客戶機(jī)應(yīng)用程序進(jìn)行 CORBA 訪問
| <module>
   <java>dwcorba1-clientapp.jar</java>
   <application-client xmlns="http://geronimo./xml/ns/j2ee/application-client"
            configId="client"
            clientConfigId="com/ibm/dw/geronimo/corba/ServerTimestampClient"
            clientParentId="org/apache/geronimo/ClientCORBA">
            <import>
                <uri>org/apache/geronimo/ClientSecurity</uri>
            </import>
            <ejb-ref>
                <ref-name>ServerTimestampEJB</ref-name>
                <ns-corbaloc>corbaloc::localhost:1050/NameService</ns-corbaloc>
                <name>ServerTimestampEJB</name>
                <css-link>NoSecurity</css-link>
            </ejb-ref>
    <realm-name>client-properties-realm</realm-name>
            <callback-handler>
               com.ibm.dw.geronimo.corba.client.SecurityCallbackHandler
            </callback-handler>
        </application-client>
</module>
 | 
清單 6 中,客戶機(jī)應(yīng)用程序的父配置被設(shè)置為 org/geronimo/corba/ClientCORBA,該文件中配置了安全 GBean 實(shí)例。<ns-corbaloc> 元素告訴 Geronimo 客戶機(jī)應(yīng)用程序容器到何處尋找 CORBA 命名服務(wù)。<css-link> 標(biāo)記指定了要使用的安全處理 GBean。<callback-handler> 標(biāo)記指定了請求身份驗(yàn)證信息時 CSS GBean 使用的回調(diào)方法。
在 Geronimo 安裝的 bin 目錄中找到 startup.bat 文件。需要做一些修改,如 清單 7 中突出顯示的代碼。其中增加了一個必需的屬性來指定 Geronimo ORB 支持類。(未來的 Geronimo 版本可能會簡化該過程。)
清單 7. startup.bat 文件的修改
| for %%z in (%CUR_DIR%) do set CUR_DIR=%%~sz set CORBA_OPTS=-Dorg.openejb.corba.UtilDelegateClass= com.sun.corba.se.internal.POA.ShutdownUtilDelegate -Dorg.omg.CORBA.ORBSingletonClass=com.sun.corba.se.internal.corba.ORBSingleton -Dorg.omg.CORBA.ORBClass=org.openejb.corba.sunorb.OpenEJBORB -Djavax.rmi.CORBA.PortableRemoteObjectClass= com.sun.corba.se.internal.javax.rmi.PortableRemoteObject -Djavax.rmi.CORBA.UtilClass=org.openejb.corba.util.UtilDelegateImpl @rem Set the path to the server.jar set SERVER_JAR="%~dp0server.jar" for %%z in (%SERVER_JAR%) do set SERVER_JAR=%%~sz :CheckServerJar ...... :StartServer echo on %JAVA% %CORBA_OPTS% -jar %SERVER_JAR% %ARGS% | 
清單 7 中的選項(xiàng)必須作為連續(xù)的一行輸入。將提供的 startup.bat 文件粘貼到 M5 bin 目錄中可能更簡單。使用這個修改后的 startup.bat 啟動服務(wù)器。
本文還提供了構(gòu)建該例子的 Ant 構(gòu)建文件。需要根據(jù) Geronimo 安裝目錄對 build.xml 作相應(yīng)的修改。構(gòu)建該項(xiàng)目使用下列命令:
| ant ear | 
然后可以在 dist 子目錄中找到 dwcorba1.ear。要將包含 EJB 和客戶機(jī)應(yīng)用程序的 EAR 部署到 Geronimo 中,請在 Geronimo 安裝目錄中運(yùn)行下列命令:
| java -jar bin/deployer.jar --user=system --password=manager deploy dwcorba1.ear deploy.xml | 
一定要將 dwcorba1.ear 和 deploy.xml 文件移動到同一目錄中。
要運(yùn)行客戶機(jī)應(yīng)用程序,請在源代碼發(fā)行版中運(yùn)行 runclient.bat 文件。該批處理文件按照和 startup.bat 相同的方式設(shè)置 ORB 支持屬性,不過這一次是對客戶機(jī)的 Java 虛擬機(jī)。runclient.bat 文件包含以下內(nèi)容:
清單 8. Runclient.bat 文件代碼
| java -Djavax.rmi.CORBA.UtilClass=org.openejb.corba.util.UtilDelegateImpl
-Dorg.openejb.corba.UtilDelegateClass=com.sun.corba.se.internal.POA.ShutdownUtilDelegate 
  -Dorg.omg.CORBA.ORBSingletonClass=com.sun.corba.se.internal.corba.ORBSingleton 
  -Dorg.omg.CORBA.ORBClass=org.openejb.corba.sunorb.OpenEJBORB 
  -Djavax.rmi.CORBA.PortableRemoteObjectClass=
    com.sun.corba.se.internal.javax.rmi.PortableRemoteObject  
  -jar bin/client.jar com/ibm/dw/geronimo/corba/ServerTimestampClient
 | 
運(yùn)行該客戶機(jī)時,將在 GUI 中顯示服務(wù)器的時間戳。該時間戳是從 CORBA 遠(yuǎn)程對象獲得的,該對象實(shí)際上由遠(yuǎn)程 Geronimo EJB 處理。圖 7 顯示了客戶機(jī)成功運(yùn)行后的結(jié)果。
圖 7. 顯示服務(wù)器時間戳的應(yīng)用程序客戶機(jī)
本文介紹了如何集成異構(gòu)的解決方案和利用已有的遺留系統(tǒng)投資,這是現(xiàn)代企業(yè)中經(jīng)常面臨的一項(xiàng)任務(wù)。CORBA 已經(jīng)證明是一種有效的解決方案,已經(jīng)部署在很多企業(yè)中。Apache Geronimo 組件與 CORBA 組件自由交互的能力,使得我們可以用最新的工具和編程方法論在現(xiàn)代 J2EE 平臺上構(gòu)建新的應(yīng)用程序。
| 描述 | 名字 | 大小 | 下載方法 | 
|---|---|---|---|
| Source code Geronimo CORBA example | code.zip | 300KB | HTTP | 
學(xué)習(xí)
- 您可以參閱本文在 developerWorks 全球站點(diǎn)上的 英文原文。
- 請訪問 The Object Management Group (OMG) 站點(diǎn),這是最主要的 CORBA 信息和規(guī)范資源。
- 從 Apache Geronimo 官方項(xiàng)目站點(diǎn) 獲得 Geronimo 最新的里程碑版本。
- 請閱讀 “創(chuàng)建 Geronimo 客戶機(jī)應(yīng)用程序”(developerWorks,2005 年 6 月),了解如何使用客戶機(jī)應(yīng)用程序容器為 Geronimo 編寫客戶機(jī)應(yīng)用程序。
- 請閱讀 “利用 Geronimo 深入 EJB Web 應(yīng)用程序”(developerWorks,2005 年 7 月),其中包含在 Geronimo 上使用 EJB 的一個簡單例子。
- 請閱讀 Damian Hagge 的 “企業(yè)中的 RMI-IIOP”(developerWorks,2002 年 3 月),從頭了解 RMI-IIOP,看看 CORBA 和 RMI 能夠多么好地配合。
- 在 developerWorks Geronimo 入門 可以找到適合新手和有經(jīng)驗(yàn)用戶的有用資料。
- 通過 IBM Support for Apache Geronimo 程序獲得專家技術(shù)支持。
- 關(guān)注 Geronimo 的最新進(jìn)展。Apache Geronimo 專家 Dave Klavon 定期更新 The Apache Geronimo Experience。
- 請訪問 developerWorks Apache Geronimo 項(xiàng)目專區(qū),這里提供了可以幫助您開始利用 Geronimo 進(jìn)行開發(fā)的文章、教程和其他參考資料。
- 請訪問 developerWorks developerWorks 開放源碼專區(qū),獲得大量的 how-to 信息、工具和項(xiàng)目更新,幫助您使用開放源碼技術(shù)進(jìn)行開發(fā)并與 IBM 產(chǎn)品結(jié)合使用。
- 通過 developerWorks WebSphere 主頁獲得關(guān)于 IBM WebSphere? Application Server Community Edition 宣告的信息,以及關(guān)于其他 WebSphere 產(chǎn)品和技術(shù)的參考資料。
獲得產(chǎn)品和技術(shù)
- 使用 IBM 試用軟件 革新您的下一個開放源碼開發(fā)項(xiàng)目,可以通過下載或從 DVD 中獲得這些軟件。
討論
- 參與論壇討論。
- Apache Geronimo 開發(fā)人員都聚集在 developerWorks 的 關(guān)注 Apache Geronimo 論壇。

Sing Li 是一位顧問和自由作家。他曾經(jīng)參與 Beginning JavaServer Pages、 Professional Apache Tomcat 5、Pro JSP - Third Edition、Early Adopter JXTA、Professional Jini、 Beginning J2ME: From Novice to Professional, Third Edition 和其他書籍的編寫。他還定期為技術(shù)雜志撰稿,也是 VON 和 P2P 發(fā)展的積極傳道者??梢酝ㄟ^westmakaha@yahoo.com 與 Sing 聯(lián)系。

研究過數(shù)學(xué),從事過生物化學(xué),做過大鍵琴制作者之后,David Jencks 又對軟件工程發(fā)生了興趣。他為多個開放源碼項(xiàng)目作出過重要的貢獻(xiàn),包括 Jaybird 和最重要的 Geronimo??梢酝ㄟ^ david_jencks@yahoo.com 與 David 聯(lián)系。

 
                         
                                
 
                                





 
                        

