程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 用Delphi客戶端訪問EJB組件

用Delphi客戶端訪問EJB組件

編輯:Delphi

摘 要:本文分析了COM客戶使用COM橋訪問EJB組件的原理,並結合實例給出了使用Delphi訪問部署在Weblogic server上的EJB組件的實例。最後對比分析了其他幾種集成方案和使用本方案的優化策略。

關鍵字:COM、EJB、分布式組件

1、 概述

CORBA、.NET、Web Service、J2EE是分別是分布式軟件體系架構的成就。J2EE在模型簡潔方面優於CORBA,同時消除了.NET對一家公司的依賴,相對於Web Service技術它相對成熟因而在業界有著重要的地位。J2EE的核心就是EJB(EnterPrise Java Bean)-一種分布式組件。

EJB組件的客戶端可以是Web方式的Applet,Jsp/Servlet,也可以是非Web方式的GUI客戶。由於PC機的盛行GUI客戶往往是基於Windows的。Delphi是windows下一個優秀的開發平台,Borland公司提供了Delphi到部署在BAS(Borland公司的EJB服務器)上的EJB訪問的優雅解決方案(在客戶端和服務器端同時使用CORBA),但卻沒有提供Delphi到部署在其他服務器上的EJB組件的解決方案。SUN公司開發了J2EE CAS COM Bridge解決了COM(Common Object Component,微軟提出的組件模型)客戶訪問EJB組件的問題。Delphi完全支持COM技術,所以Delphi可以作為EJB的客戶。本文集中探討如何利用Delphi訪問EJB組件。

J2EE CAS COM Bridge(後面簡稱為COM橋)是SUN公司提供的一個橋軟件,通過它,能使用COM技術的任何一種開發工具開發的客戶都可以順利的訪問J2EE服務器上的EJB組件。

如圖1.1所示,J2EE CAS COM Bridge在客戶應用地址空間啟動JVM(Java虛擬機),COM橋提供把JVM包裝成COM組件的外覆COM組件,客戶使用這些外覆COM組件來訪問JVM。從而客戶做出一個COM調用時,COM橋使用JNI(Java Native Interface)把它轉發到進程內JVM,JVM把這一調用發往服務程序(當訪問J2EE服務器時使用RMI/IIOP協議來發送請求),即客戶的調用最終變成了一個真正的Java調用,而中間實現這一轉換的過程由COM橋來完成,無需開發者關心。在訪問本地java對象和訪問J2EE服務器都是同一原理。

由於JVM是在客戶進程地址空間內部啟動,所以我們可以單獨控制它的運行參數,而不影響其它應用對JVM的訪問。

2、使用Delphi下COM客戶實現對EJB組件的訪問

2.1 COM橋的服務層次

如同操作系統的分層模型,COM橋提供的服務也是以不同的層次來使用的,最底層是它提供的核心層。核心層由三個COM類組成:JvmStartup, JavaVirtualMachine, 和JavaProxy(使用它們必須引用類型庫J2EE Client Access Services COM Bridge 1.0 Type Library,其他服務模塊分別對應不同的類型庫)。只有JvmStartup能被直接創建。JvmStartup用來創建JavaVirtualMachine的實例,JavaVirtualMachine是一個單態類,也就是說,不管你創建多少次,他們其實共享一個實例。JavaVirtualMachine提供查找、載入和創建Java類實例的接口。所有的Java類實例使用JavaProxy代表,以上是COM橋最重要的接口。每個java對象擁有自己的JavaProxy,他們之間一一對應。你訪問JavaProxy時,會被JVM把調用轉發至一個Java類的實例。

COM橋裡存在的所有其他對象和接口是為了直接或者間接的獲得JavaProxy。核心服務層提供的接口足夠執行COM橋所能實現的所有任務,然而對於多數都是比較常用的任務而言,直接使用這些接口顯得過於復雜和笨拙。所以基於一些常用應用提供了簡化的服務模塊。

Java服務模塊(J2EECAS Java Services 1.0 TypeLib)提供了對常用的如類的載入,對象創建,訪問靜態方法和類型轉換等任務的改進訪問方式。並且還提供了java控制台窗口顯示、java標准輸出和查看出錯信息。

企業級服務模塊包含多個模塊,提供對不同J2EE服務器的訪問。訪問不同的J2EE服務器要使用不同的模塊,但是他們提供了統一的接口用於登陸服務器和查找EJB的Home接口。腳本服務層是為不能直接使用IDispath接口的腳本語言環境(如ASP)提供訪問能力。JVM控件提供一個用於動態修改運行時JVM參數的ActiveX控件。

COM橋提供了一套工具集用於更方便的配置COM橋和虛擬機選項以及創建和部署類型庫。COM橋配置工具集設置COM橋運行時默認的JVM的參數。JVM Configuration Editor用於JvmControl組件參數的編輯,他可以創建JvmControl運行時能讀取的配置文件。GenTypeLib 用於為java類生成類型庫。類型庫工具用來支持靜態綁定COM方式編程。如果你要把類型庫隨你的應用一起部署,你必須使用REGTYPELIB工具在目標機器上注冊類型庫。

2.2開發環境

本文實例在Windows 2000 Server系統下,使用j2sdk1.4.0_03、J2EE CAS COM Bridge 1.0 、Delphi 7、Jbuilder 8、Weblogic server 7作為開發工具,全部通過測試並運用於實際項目中。EJB組件部署在Weblogic server,客戶端運行時必須安裝JVM和COM橋。

2.3實現訪問EJB組件

這裡以訪問一個簡單的會話Bean為例來說明如何在Delphi中集成EJB和COM客戶。

這個部署在Weblogic Server上的會話Bean有一個簡單的test()方法:

public String test() {

return new String("Test successfully!");

}

這裡就不描述Bean的具體開發過程,按通常的方式實現它,無需任何特別的修改。假定這個Bean的JNDI名稱為"ServiceFacade",Home接口和Remote接口分別為ServiceFacade和ServiceFacadeHome。

現在我們來實現客戶端。為了簡化起見,我們直接使用默認的JVM屬性,所以這裡要把weblogic.jar和Bean的客戶部署類(示例使用client.jar)添加到環境變量CLASSPATH裡面(只要類在JVM的類搜索路徑裡,我們就能通過COM橋來訪問它)。

為了簡化編程我們使用動態綁定方式調用COM橋(如果使用靜態綁定方式必須使用COM橋提供的類型庫工具為需要訪問的Java類生成類型庫和注冊類型庫)。這裡需要提出的一點是默認情況下COM橋只支持J2EE的參考實現,要想讓COM橋支持Weblogic server,要注冊COM橋提供的Weblogic服務模塊(在命令行提示下執行 regsvr32 %J2EE_CAS_BRIDGE%\doc\appserver-connectivity-asmples\bin\ weblogic-services.dll)。因為COM橋把客戶的調用轉換成了真正的java調用,所以我們可以按照java客戶訪問EJB的步驟來使用COM訪問。

COM橋與客戶交互時傳遞的對象實現了OLE自動化接口,在Delphi裡面我們可以使用IDispatch來容納[3]。企業級服務模塊簡化了其中的部分步驟,它為我們完成了初始化上下文等任務。以下為客戶端示例。

初始化企業服務模塊:

var : ws: variant;

{1、訪問其他服務器時,可以從注冊表查找到企業服務的名稱

2、 不同的服務器對應的模塊提供相同的接口

3、 企業級服務模塊簡化了操作

4、 COM橋返回的對象都是IDispatch接口,可以把一個IDispath接口賦給一個variant變量

}

ws:=CreateOleObject('J2EECAS.WeblogicServices');//新建Weblogic服務類的實例

ws.ProviderURL:='t3://127.0.0.1:7001';//JNDI的初始URL

查找Home對象和創建EJB對象:

var : jHome,obj variant;

JHome: =ws. LookUpEjb ('ServiceFacade','ServiceFacadeHome');

//參數為JNDI名和Home接口名 ,把Home對象作為Idispatch接口返回。

Obj: =jHome. Create;//

ShowMessage(obj.test);//調用EJB對象的方法test()。

至此已經成功實現了COM客戶對EJB組件的訪問。

3、訪問策略的考慮

3.1與其他集成方案的比較

Windows下GUI模式非java客戶訪問EJB還可以有其他的集成方案,可以采用以下幾種:

使用CORBA集成。CORBA是支持跨語言和跨平台的一種分布式應用解決方案,很多語言都支持CORBA,因此我們只需要用java建立一個CORBA服務器應用來調用EJB組件,就可以使用支持CORBA的任何客戶端語言。這種方法有幾個大的弊端,一是增加開發成本,另外在EJB和客戶中間多了一個網絡服務層,明顯會降低系統性能,增加維護的復雜性,此外我們要為所涉及的所有Java類生成IDL文件供客戶使用,增加了開發的復雜性。Delphi使用CORBA到BAS的訪問雖然很簡潔,但不夠通用,它只支持BAS。

使用Web Services集成。EJB可以作為Web Service發布,使用它發布的WSDL文件,便可以方便的開發客戶端應用。但這種方式不能充分利用EJB容器的安全策略。此外客戶與服務器之間要傳遞Web Service不能直接支持的復合類型時,在服務器端要對這些類型編寫附加的外覆類用於到XML數據之間的相互轉換,增加了開發的復雜性。但這種方案較之COM橋更容易與其他應用進行數據交換,因為它是基於XML的。因此Web Service可以作為一種可選集成方案。

3.2優化考慮

如果業務邏輯和數據分散在不同的會話Bean和實體Bean中,我們直接使用COM訪問它們,就必須查找每一個Home對象,這種JNDI查找非常費時,一種優化的策略是,我們對每種類型的客戶使用一個會話Bean外觀來封裝他所需要的其他Bean提供的業務方法和數據,由這個會話Bean來調用其他Bean。最新的EJB規范增加了一個LocalHome接口用於服務端對Home接口的查找,比直接查找Home接口快。我們使用會話外觀可以減小響應時間。

客戶往往需要實體Bean的多個值,為了減少遠程調用的數目,同時為了避免相關的負載,最好使用一個值對象把來自於實體Bean的數據傳遞給客戶端。

4、結束語

COM橋使得GUI用戶能高效訪問EJB組件,將EJB組件的客戶進行了擴展,同時充分結合了Windows平台下開發工具開發圖形用戶界面的優勢。可以作為一種集成方案應用用在基於J2EE的分布式系統中。在不改變用戶界面風格的情況下使得我們可以利用先進的EJB組件帶來的優勢。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved