Apusic應用伺服器和CORBA互操作

來源:互聯網
上載者:User

CORBA(Common Object Request Broker Architecture, 公用對象請求代理體繫結構)是由OMG(對象管理組織,Object Management Group)提出的應用軟體體繫結構和對象技術規範,被廣泛的用來開發分布式系統。Apusic應用伺服器是以RMI-IIOP(Remote Method Invocation Internet Inter-ORB Protocol)協議為基礎完成分布式的對象的遠端存取,因此可以和CORBA對象進行互相調用。並且,Apusic應用伺服器還完整的實現了CORBA-EJB映射規範,能夠在多個應用伺服器執行個體和CORBA用戶端之間傳播事務、安全等上下文資訊。CORBA和EJB的互操作規範包含以下四個方面: EJB介面到CORBA介面的映射;

JNDI名字到CORBA名稱服務(CosNaming )的映射;

EJB和CORBA之間的事務傳播;

EJB和CORBA之間的安全傳播。

本文將通過一個範例展示CORBA用戶端訪問部署在Apusic上的EJB。雖然這是Apusic和CORBA互操作最簡單的一個方面,並且不涉及安全和事務的傳播,但已經顯示了Apusic在互操作方面的能力和開發的一般步驟。

首先介紹一下伺服器和用戶端的開發運行環境。伺服器端的環境為:

Windows 2000 Server

JDK1.4.2

Apusic應用伺服器3.0

用戶端的環境為:

Windows 2000 Professional

JDK1.4.2

Apusic應用伺服器完全支援標準的EJB-CORBA映射,也就是說,EJB的home和remote也是CORBA對象。我們可以使用JDK提供的RMI編譯器rmic -idl為EJB產生CORBA視圖的IDL介面。用來定位EJB home介面的JNDI(Java naming service)被映射成CORBA naming service,這樣,CORBA用戶端就能尋找和定位home介面並象CORBA對象一樣使用它們。下圖描述了CORBA用戶端訪問EJB的一般步驟:這些步驟包括:

開發並部署EJB;

使用RMI編譯器rmic -idl為EJB遠程介面產生IDL;

使用CORBA IDL編譯器根據用戶端的程式語言為用戶端產生存根(stub);

配置EJB伺服器使用CORBA名稱服務。Apusic預設就使用CORBA名稱服務作為JNDI 服務的提供者;

CORBA用戶端在CORBA名稱服務中尋找和定位EJB;

CORBA用戶端象訪問普通CORBA對象一樣訪問EJB;

首先開發一個EJB模組,編譯並部署到Apusic應用伺服器上。這個例子中的EJB非常簡單,是一個Stateless Session Bean,只包含一個業務方法sayHello。

public java.lang.String sayHello(java.lang.String name) {

String result = "hello, " + name;

System.out.println("invoke sayHello() : " + result);

return result;

}

然後使用RMI編譯器rmic -idl為EJB遠程介面產生IDL:

rmic -idl -noValueMethods

-classpath %apusic_home%/lib/apusic.jar;../ejb/build

-d idl samples.ejb.Hello samples.ejb.HelloHome

理論上可以使用任何CORBA規範支援的程式語言開發CORBA用戶端。本範例展示的是Java CORBA用戶端的開發。使用JDK1.4.2提供的idlj編譯上一步得到的IDL:

idlj -emitAll -i ./idl -i %java_home%/lib

-fclient

-pkgPrefix java apusic

-pkgPrefix javax apusic

-pkgPrefix samples apusic

-td src

./idl/samples/ejb/Hello.idl

idlj -emitAll -i ./idl -i %java_home%/lib

-fclient

-pkgPrefix java apusic

-pkgPrefix javax apusic

-pkgPrefix samples apusic

-td src

./idl/samples/ejb/HelloHome.idl

注意,我們為IDL檔案中的java、javax和samples模組在產生代碼時增加了“apusic”作為package的首碼,這樣可以避免同Java核心API的衝突。

JDK1.4.2提供的idlj編譯器產生的Java程式碼封裝含了bug,必須手工更改這些錯誤。將類_Exception.java,CreateException.java和RemoveException.java中的_read和 _write方法注釋或刪掉。

這時,我們根據IDL編譯器編譯產生的Java檔案,提供用戶端實現,主程式的代碼片斷如下:

ORB orb = ORB.init(args, null);

// Look up the HelloHome, create an Hello and use it.

NamingContextExt nc =

NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));

HelloHome home =

HelloHomeHelper.narrow(nc.resolve_str("ejb/CORBAClientSample"));

Hello hello = home.create();

String str = (String) hello.sayHello("apusic,corba client");

System.out.println(str);

System.exit(0);

從上面的代碼中我們看到了CORBA用戶端如何在CORBA名稱服務中尋找和定位EJB,並且如何象訪問普通CORBA對象一樣訪問EJB。

最後我們編譯並運行用戶端。注意,我們並不需要編譯所有idlj產生的Java源檔案,只要編譯包apusic.sample.ejb和我們編寫的用戶端主程式。Java編譯器會根據類的串連情況自動編譯類中引用的其他類。

javac -d ../build -sourcepath ./ apusic\samples\ejb\*.java

javac -d ../build -sourcepath ./ CorbaClient.java

確認EJB已經部署在Apusic上並且伺服器正常運行。在命令列啟動CORBA用戶端,通過啟動參數告訴用戶端Apusic的位置和連接埠,來保證用戶端ORB的正確初始化。假定Apusic運行在本機上,連接埠為6888:

java CorbaClient -ORBInitialHost localhost -ORBInitialPort 6888

如果前面的步驟都正確完成,我們將在用戶端的螢幕上看到: hello, apusic,corba client

這個例子只是簡單的展示了CORBA用戶端能夠訪問EJB組件的業務方法。實際上CORBA和EJB的互操作複雜的地方在於事務和安全的映射,因此要求開發人員對CORBA規範和開發比較熟悉。而且Java到IDL的映射可能遇到很多問題,例如:ValueType映射,集合的使用等,這就使CORBA用戶端訪問EJB在很多情況下不能成功。即使如此,Apusic支援和CORBA的互操作,依然對我們整合已有的CORBA系統、開發異構環境的分布式應用提供了很大的協助,只是對開發人員的技術要求比較高。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.