據(jù)Gartner的研究分析,在名列全球前1000名的企業(yè)中,大約90%都混合應(yīng)用了java和Windows技術(shù)。然而,Java技術(shù)和微軟技術(shù)分別提供了豐富但卻迥然不同的解決方案,或至少說這兩種方案之間的差異是巨大的。
為了解決這一矛盾,Sun率先提出了JNI解決方案。JNI,即Java本機(jī)接口,是編寫Java本機(jī)方法和把Java虛擬機(jī)嵌入到本機(jī)應(yīng)用程序中的標(biāo)準(zhǔn)編程接口。Java本機(jī)接口的主要目的就是保證本機(jī)方法庫在不同平臺(tái)上的Java虛擬機(jī)中的二進(jìn)制兼容性。使用JNI編寫程序,就可以很方便地做到程序的跨平臺(tái)可移植。盡管如此,Sun提供的JNI解決方案只是底層的API包裝,在實(shí)際開發(fā)中用到大量Java/COM互操作時(shí),直接從JNI級(jí)進(jìn)行開發(fā)顯然效率并不高。
為此,大大小小的公司甚至個(gè)人都試圖提供全部或局部的Java/COM互操作解決方案。例如,WebLogic提供的jCOM技術(shù),bridge2java(IBM提供的基于Java本機(jī)接口和COM技術(shù),答應(yīng)把ActiveX對(duì)象輕易地集成到Java環(huán)境中),jacoZoom(是一個(gè)java類庫—它答應(yīng)你在java程序中使用ActiveX控件和ActiveX服務(wù)器,基于Java本機(jī)接口和COM技術(shù),答應(yīng)使用于Windows平臺(tái)上的任何java環(huán)境中),J-Integra for COM(http://j-integra.intrinsyc.com/),還有一個(gè)小型的JCom橋接庫(http://sourceforge.net/PRojects/jcom/,它也支持從Java中調(diào)用COM對(duì)象,例如Excel工作簿,VB的COM對(duì)象等)。其中,WebLogic提供的jCOM技術(shù)為微軟的COM對(duì)象和Java對(duì)象提供一個(gè)穩(wěn)定、無縫的機(jī)制,讓這兩種對(duì)象可以協(xié)同工作。
jCOM,即Java/COM橋,它是一種用軟件實(shí)現(xiàn)的橋接機(jī)制,可以幫助Java應(yīng)用程序快速訪問微軟的COM/DCOM組件。而且,微軟的COM應(yīng)用程序也可以通過這個(gè)機(jī)制訪問基于Java的對(duì)象。jCOM不僅具有實(shí)現(xiàn)相對(duì)簡單的特點(diǎn),而且其最吸人的部分在于它的透明性。對(duì)Java程序員來說,COM對(duì)象看起來與其他Java對(duì)象沒有什么不同。而對(duì)COM開發(fā)人員來說,遠(yuǎn)程Java對(duì)象看起來就象是本機(jī)COM組件。在這些對(duì)象中可以找到j(luò)COM運(yùn)行時(shí)刻引擎進(jìn)行動(dòng)態(tài)類型映射,因此從表面上屏蔽了數(shù)據(jù)類型間的差異。遠(yuǎn)程對(duì)象的數(shù)據(jù)類型被動(dòng)態(tài)地轉(zhuǎn)換成調(diào)用程序所使用的基元類型。對(duì)Java開發(fā)人員來說,COM數(shù)據(jù)類型表現(xiàn)得就象Java基元類型;而對(duì)COM開發(fā)人員來說,Java數(shù)據(jù)類型看起來就象是COM數(shù)據(jù)類型。
本文將重點(diǎn)討論BEA的Java/COM解決方案。
二、jCOM工作原理
jCOM聲稱以雙向方式工作,實(shí)際只是答應(yīng)在Java和COM組件之間,在任意一個(gè)方向上通信—Java對(duì)象可以調(diào)用COM組件,COM組件又可以調(diào)用Java對(duì)象。當(dāng)然,在這兩種不同的分布式組件框架之間,有著兩種截然不同的底層體系結(jié)構(gòu)負(fù)責(zé)線路級(jí)通信。在運(yùn)行時(shí),jCOM內(nèi)部設(shè)置了一個(gè)雙協(xié)議棧環(huán)境,實(shí)現(xiàn)對(duì)底層兩個(gè)彼此獨(dú)立的基礎(chǔ)結(jié)構(gòu)的支持(參考圖1)。對(duì)于COM組件,有一個(gè)在DCE遠(yuǎn)程過程調(diào)用之上的COM/DCOM實(shí)現(xiàn)。對(duì)于Java對(duì)象,有一個(gè)在Java遠(yuǎn)程方法IIOP(Internet Inter-ORB)之上的遠(yuǎn)程方法調(diào)用(RMI)實(shí)現(xiàn)。調(diào)用要通過這些協(xié)議棧,并通過內(nèi)部的協(xié)議轉(zhuǎn)換進(jìn)行處理,內(nèi)部的協(xié)議轉(zhuǎn)換能夠有效地屏蔽掉低一級(jí)的協(xié)議。對(duì)于EJB來說,來自COM客戶的調(diào)用看起來就似乎是來自Java客戶的調(diào)用。對(duì)于COM組件來說,來自Java客戶的調(diào)用看起來就好象是來自一個(gè)普通的COM客戶。
jCOM提供了能夠自動(dòng)生成更高級(jí)別COM/DCOM代理以及RMI存根的工具。客戶程序用COM/DCOM代理以及RMI存根在這兩個(gè)不同的基礎(chǔ)結(jié)構(gòu)間封裝并傳送調(diào)用。jCOM可以設(shè)置成本機(jī)模式,這樣就可以利用本機(jī)操作系統(tǒng)的動(dòng)態(tài)鏈接庫,從而減輕DCOM的網(wǎng)絡(luò)負(fù)荷,并極大地提高系統(tǒng)性能。
下面看一下Java對(duì)象如何調(diào)用COM對(duì)象:
import com.jCOMSample.account.*;
clsaccount account=new clsaccount();
double accountbalance=getaccountbalance("Xiao Wang");
圖1演示了當(dāng)Java對(duì)象訪問COM組件的時(shí)候事件產(chǎn)生的標(biāo)準(zhǔn)流程。首先,jCOM為要訪問的COM組件生成—個(gè)代理對(duì)象,Java對(duì)象開始調(diào)用這個(gè)代理對(duì)象。然后,代理對(duì)象與jCOM運(yùn)行時(shí)引擎通信,jCOM運(yùn)行時(shí)引擎又把代理對(duì)象的消息封裝成遠(yuǎn)程過程調(diào)用的COM/DCOM形式,通過TCP/ip發(fā)送到Windows環(huán)境里的COM組件。在最低的一層上,jCOM使用服務(wù)器上的標(biāo)準(zhǔn)Java網(wǎng)絡(luò)類進(jìn)行調(diào)用。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注