亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

集成EJB和CORBA/CORBA客戶端訪問EJB

2019-11-18 15:07:47
字體:
來源:轉載
供稿:網友

  摘要:

EJB與CORBA的集成能力對于集成基于java或非JAVA的應用來說是很重要的。本文描述了如何實現一個EJB與一個CORBA的C++應用相集成。它闡述了幾個重要的集成問題,尤其是那些EJB采用JAVA固有的或是用戶定義的對象作為參數或返回值的方法時涉及的問題。

EJB對于用JAVA來開發要害業務應用程序是非常重要的。但是,業務應用不是孤立存在的,當今,企業需要集成各種應用。從而,把基于EJB的解決方案與現有的應用系統集成起來就變得越來越重要了。

在本文中,我將說明如何從一個非JAVA語言編寫的應用中訪問EJB。更加非凡地是,我將討論從一個CORBA的C++客戶端訪問會話和實體Bean(它使用同步的IIOP協議進行通信)。我沒有提到消息驅動Bean,盡管你可能想從其它語言編寫的應用中使用MOM產品來訪問它們。

1. RMI-IIOP
會話Bean和實體Bean使用遠程方法調用(RMI)來進行同步通信。J2EE1.3要求JAVA客戶端使用RMI-IIOP。RMI-IIOP采用CORBA的IIOP協議,這使得RMI-IIOP與CORBA相兼容。換句話說,不是基于JAVA開發的客戶端可以通過CORBA與EJB進行通信。

要實現這點,你必須使用符合J2EE1.3的應用服務器。以前的EJB規范沒有要求你去用RMI-IIOP協議。而是,應用服務器采用了RMI-JRMP或是其它私有協議。另外,你必須使用符合CORBA2.3.1或更高版本的ORB。以前的CORBA版本沒有實現與RMI-IIOP協議進行互操作所必需的規范,尤其是后來集成中CORBA規范和JAVA到IDL的語言映射規范中的用值傳遞對象的規范(可以參看CORBA/IIOP規范2.6版,在“值類型語義”一章)。

值類型語言增加了用值來傳遞對象的概念,是由RMI引來,加入到CORBA中的。CORBA最初并不支持這項功能;但是,這個概念對于實現JAVA與CORBA之間的互操作是至關重要的。

JAVA到IDL語言映射規范定義了如何把JAVA接口映射到CORBA的IDL語言。這個定義使CORBA分布對象可以訪問本來不具有CORBA的IDL的EJB(還有那些RMI-IIOP分布對象)。非凡的是,這個規范定義了一個JAVA的RMI子集,叫RMI/IDL,它可以讓你

映射到IDL,用IIOP(或是更通用,是GIOP協議)作為通信的底層協議。

2. RMI/IDL
許多RMI/IDL數據類型遵循一定的約束;我們來看一下那些最重要的類型。更具體的信息,請參看JAVA到IDL的語言映射規范。

表1顯示了JAVA基本類型到IDL的映射。

表1:JAVA到IDL的映射

Java
OMG IDL

void
void

boolean
boolean

char
wchar

byte
octet

short
short

int
long

long
long long

float
float

double
double


JAVA包映射為IDL的模塊。RMI/IDL中的遠程接口映射為IDL的接口并具有相對應的名字。但是,那些用JavaBean命名方式用來只讀或讀寫屬性的方法被映射為IDL的屬性。后面我將提到這個。

JAVA中可序列化的對象映射為CORBA的值類型。值類型為CORBA提供了用值來進行傳遞的語義。值類型是屬于本地的,不能被遠程調用。它們不注冊到ORB中,也不需要標識符,因為它們的值就是它們的標識符。更具體的信息,請參閱《PRofessional J2EE EAI》和CORBA/IIOP規范2.6版。

就象我已經提到過的,所有的JAVA或序列化的對象,包括JAVA固有的和用戶定義的,都將映射為值類型。但是,這個規則也有一些例外----例如,當你想把java.lang.String映射到IDL時。假如把它定義為常量(final static),這個對象將被映射為IDL的wstring。在其它情況下,包括作為方法的參數或返回值,該對象都被映射為值類型CORBA::WStringValue。這個值類型是CORBA模塊的一部分,它的IDL定義如下:

valuetype WStringValue wstring;

這等同于下面的IDL定義:

valuetype WStringValue {

public wstring data;

};

但是,要記住,第一種定義能夠更干凈地映射到JAVA。表2列出其它非凡的映射情況。

表2:其它重要的非凡映射情況

Java
OMG IDL

java.lang.Object
::java::lang::_Object

java.lang.String
::CORBA::WStringValue or wstring

java.lang.Class
::javax::rmi::CORBA::ClassDesc

java.io.Serializable
::java::io::Serializable

java.io.Externalizable
::java::io::Externalizable

java.rmi.Remote
::java::rmi::Remote

org.omg.CORBA.Object
Object


3. 實現集成
后面我將返回來討論值類型,先討論用戶定義的類,再討論內嵌的類,如Vectors、Collections和Enumerations?,F在,讓我們看一下CORBA和EJB集成的基本方式。首先,我們需要一個EJB。在第一個例子中,我們使用一個簡單的會話Bean,它只使用簡單的數據類型作為方法的參數和返回值。我們沒有強行去用值類型。(注重:從CORBA客戶端訪問實體Bean跟訪問會話Bean的過程一樣。)

這個方式是最簡單的;但是,你不能把它用在復雜的接口上。它的好處是:你可以使用不支持值類型的ORB。許多CORBA產品都是這樣(不支持值類型),尤其是那些不是用C++實現的產品。

這個例子中,我將使用C++版本的ORBacus4.1.0作為CORBA的ORB,使用VC++6.0作為編譯客戶端代碼的編譯器。為部署這個例子中的EJB,我將使用JBoss3.0.0。你可以從網上下載ORBacus4.1.0(也可以從IONA網站上下載)和JBoss3.0.0。

你可以使用任何支持CORBA2.3.1或更高版本的ORB產品(只要它支持到C++的映射)、一個相對應的C++編譯器和一個支持J2EE1.3規范的應用服務器。理論上講不需要修改代碼;但是,假如你使用其它產品,小的改動可能是必要的。

4. EJB會話Bean
讓我們簡單地看一下這個名叫CorbaEai的會話Bean。在我們的第一個例子中,這個簡單的遠程接口包含一個計算兩個整數之和的簡單方法。

package eai;

import java.rmi.RemoteException;

import javax.ejb.EJBObject;

public interface CorbaEai extends EJBObject {

public int sum(int a, int b) throws RemoteException;

}

在你熟悉了集成過程之后,我將告訴你如何擴展這個接口以包含使用用戶定義的對象和內嵌對象的方法。

要轉這個例子,你必須把會話Bean部署到一個應用服務器上。這要求你定義Home接口、實現這個Bean的實現類、定義部署描述器、創建jar文件并最終部署這個EJB。我不寫這些步驟了,但是你可以下載這個例子的源碼包。

5. 開發CORBA客戶端
要開發CORBA客戶端,我們需要完成以下步驟:

l 從會話Bean的Home接口和組件遠程接口生成IDL

l 簡化生成的IDL

l 編譯IDL接口,生成相應的編程語言的代碼----我們這個例子中是C++----來生成樁及其它必需的映射

l 確定如何使用JNDI作為CORBA的名字服務

l 開發C++的客戶端和支持值類型

l 創建客戶端

5.1. 生成IDL
為從JAVA接口生成IDL,你可以使用任何支持JAVA語言到OMG的IDL映射規范的工具。例如:

l rmic編譯器,由JSDK1.3或更版本提供,使用-idl選項;

l java2idl,由VisiBroker提供;

l rmic和ejbc(使用-idl)編譯器,由BEA的WebLogic提供

其它的應用服務器提供類似的工具。需要明確的是,從EJB接口生成IDL接口要比從RMI-IIOP接口生成復雜得多。首先,EJB接口繼續于EJBObjec和EJBHome接口,它們定義了一些基本方法。因為IDL接口也必須繼續于這些接口,所以其工具也必須為這些接口生成IDL接口。其次,EJB的home接口中的方法至少拋出CreateException異常,所以其工具也必須把這個異常和一些其它用戶定義的異常映射到IDL。

這兒我用的是JSDK1.3.1提供的rmic,注重要把包含要映射的接口的jar包包含在classpath中(對于JBoss來說,要包含$JBOSSHOMEclient jboss-j2ee.jar)。這兒需要映射的是eai.CorbaEai和eai.CorbaEaiHome兩個類:

rmic -idl -classpath "%classpath%;corbaeai.jar" eai.CorbaEai eai.CorbaEaiHome -d ./idl

rmic編譯器在目錄./idl下生成IDL文件,共有26個。

5.2. 簡化生成的IDL的文件
用C++來實現所有的生成的接口和值類型是很費時間的。但是我們并不需要所有的生成的接口,因為有一些方法我們沒有去用。所以我們可以通過簡化生成的IDL接口文件來節省一大部分工作。

對于這第一個例子,我們不去用EJBObject和EJBHome兩個接口上的方法,我們也不需要EJBMetaData。我們也不需要非凡的RemoveException異常,這樣,我們就可以不用RemoteExceprion和RemoteEx兩個IDL接口。我們還可以除去下列IDL接口:java.io、java.lang和java.rmi。

為進一步簡化IDL文件,我們把所需要的IDL接口放在一個文件中。經過簡化以后,得到以下IDL文件CorbaEai.idl:

#include "OB/orb.idl" //ORBacus中的orb.idl在OB目錄下。



module javax {

module ejb {

valuetype CreateException {

};



#pragma ID CreateException "RMI:javax.ejb.CreateException:FD98A9711F66DF7F:575FB6C03D49AD6A"



exception CreateEx {

CreateException value;

};

};

};



module eai {



interface CorbaEai {

long sum(

in long arg0,

in long arg1 );

};

#pragma ID CorbaEai "RMI:eai.CorbaEai:0000000000000000"



interface CorbaEaiHome {

::eai::CorbaEai create( ) raises (

::javax::ejb::CreateEx );

};

#pragma ID CorbaEaiHome "RMI:eai.CorbaEaiHome:0000000000000000"

};

5.3. 編譯IDL接口
接下來,我們把IDL接口映射到客戶端的編程語言。我們在客戶端用C++,這兒我們用ORBacus的idl編譯器(你可以用任何支持CORBA2.3.1或更高版本規范的IDL到C++的編譯器)。

假如你仔細看IDL的文件,你會發現它包含了一個文件orb.idl。在我們的例子中,我們用ORBacus自帶的orb.idl文件,它在$ORBacusHome/idl/OB目錄下。因此,在使用IDL編譯器時,我們要指定包含orb.idl的路徑。我們用ORBacus所帶的IDL編譯器進行編譯,因為我們只是編寫客戶端,所以不需要服務方的骨架文件:

idl -IE:OOCidl --no-skeletons CorbaEai.idl

會生成stub文件CorbaEai.h和CorbaEai.cpp。

5.4. 使用JNDI作一個CORBA名字服務
在我們開發C++客戶端之前,先考慮一下如何獲得會話Bean的Home接口CorbaEaiHome的初始引用。CorbaEaiHome已經注冊到應用服務器的JNDI上,所以C++的客戶端必須訪問JNDI名字服務。

有一些應用服務器,就象BEA的WebLogic,提供了一個跟CORBA名字服務相兼容的接口去訪問JNDI。為測試這一點,我們可以用WebLogic的host2ior工具,它將輸出這個名字服務的使用IIOP和IIOP/SSL的IOR。對我們這個例子來說,我們只對非安全的IIOP感愛好。JBoss也提供一個CORBA名字服務,從JBoss的啟動日志中可以看到這個服務的IOR。

CORBA名字服務是一個有著標準接口的CORBA分布對象,從技術上講,它和其它CORBA對象一樣。因此,我們可以通過IOR直接連接到JNDI。

但是,一個更好的方法是通過用一個要害字NameServie析取初始引用來得到名字服務的引用。在本例中,我們在啟動客戶端時指出所要用的名字服務,我們通過命令行實現,在后面將會提到。

5.5. 開發C++客戶端
我們開發一個簡單的C++客戶端來調用會話Bean CorbaEai上的sum()方法。假定你熟悉CORBA??蛻舳说闹鞒绦駽lient.cpp如下:

#include <OB/CORBA.h>

#include <OB/CosNaming.h>



#include <CorbaEai.h>



#ifdef HAVE_STD_IOSTREAM

using namespace std;

#endif



int run(CORBA::ORB_ptr orb, int argc, char* argv[])

{

//

// Get naming service

//

CORBA::Object_var obj;

obj = orb -> resolve_initial_references("NameService");



CosNaming::NamingContext_var nc =

CosNaming::NamingContext::_narrow(obj.in());



//

// Resolve names with the Naming Service

//

CosNaming::Name name;

name.length(1);

name[0].id = CORBA::string_dup("Corba-Eai");

name[0].kind = CORBA::string_dup("");



cout << "Resolved `CorbaEaihome´" << endl;

CORBA::Object_var aObj = nc -> resolve(name);

eai::CorbaEaiHome_var ceaihome = eai::CorbaEaiHome::_narrow(aObj.in());

assert(!CORBA::is_nil(ceaihome.in()));



cout << "Creating a new instance" << endl;

eai::CorbaEai_var ceai = ceaihome->create();



cout << "Result: "<< ceai->sum((CORBA::Long)15,(CORBA::Long)20)<< endl;



return EXIT_SUCCESS;

}



int main(int argc, char* argv[], char*[])

{

int status = EXIT_SUCCESS;

CORBA::ORB_var orb;



try

{

orb = CORBA::ORB_init(argc, argv);

status = run(orb, argc, argv);

}

catch(const CORBA::Exception& ex){

cerr << ex << endl;

status = EXIT_FAILURE;

}



if(!CORBA::is_nil(orb)){

try {

orb -> destroy();

}

catch(const CORBA::Exception& ex){

cerr << ex << endl;

status = EXIT_FAILURE;

}

}

return status;

}

5.6. 建立和運行客戶端
我們用VC++6.0建立C++的客戶端。源文件是idl編譯生成的客戶端的stub文件CorbaEai.h和CorbaEai.cpp和主程序文件Client.cpp。生成可執行文件CorbaEai.exe。

按照以下步驟運行本例子:

l 啟動應用服務器,在我們的例子中是JBoss3.0。為了啟動IIOP,所以用all模式來啟動JBoss3.0.0(可能集群服務啟動不起來,假如起不來,可以先把集群服務屏蔽掉)。

l 部署會話Bean CorbaEai到JBoss應用服務器上。

l 使用下面的命令啟動C++客戶端程序:

CorbaEai ?CORBInitRef NameService=corbaloc::localhost:8683/JBoss/Naming/root

注重在本例中,EJB應用服務器和客戶端在同一臺機器上。假如要進行遠程通信,需要用一個真正的名字或是ip地址代替localhost。

6.值類型
這個例子還是十分的不完美。它沒有為Java的可序列化對象實現值類型,這就意味著我們不能捕捉到遠程異常(因為正象IDL中所表示的,它們被映射成值類型)。另外,在第一個例子中我還限制了方法只使用原始的數據類型。

為了理解CORBA是如何處理Java的可序列化的類,你必須看一下CORBA的值類型。Java的可序列化對應著值類型。每一個被作為參數、返回值或異常傳自于/傳遞到CORBA客戶端的Java可序列化的對象都應該用客戶端的編程語言再實現一次,在我們的例子中就是C++。這需要一定的工作。不幸的是,我不知道那些對Java的固有類型,如Remote、Throwable、EJBObject和EJBHome完全支持的CORBA實現。據我所知,只有IBM的WebSphere應用服務器提供了一個值類型的庫,它包含了諸如Integer、Float、Vector、Exception和OutputStream等這些常用的Java類型的C++值類型的實現。根據WebSphere4.0應用服務器的文檔,它的值類型庫只支持WebSphere的C++ ORB。

對每一個值類型,IDL到C++的編譯器生成一個指針類型的定義_ptr和一個_var類。_var類自動治理為對象引用動態分配的內存。一個轉換操作符讓你也可以把一個_var賦給_ptr。還需要提醒的是,原始的Java構造器不能映射到IDL。但是,當IDL映射到C++時,構造器變成工廠類的init方法。

為實現值類型(比如用C++),你需要:

l 實現一個值類型的類,它要繼續于值類型的基類(由IDL編譯器生成)和缺省的值引用計數的基類。對于值類型,你必須手工實現引用的計數。

l 實現工廠類和工廠方法。

l 把工廠注冊到ORB。

讓我們看一下CreateException值類型的例子。首先,我們聲明它的實現類CreateExceptionImpl:

class CreateExcepionImpl : public virtual ::javax::ejb::OBV_CreateException,

public virtual CORBA::DefaultValueRefCountBase

{

我們至少必須實現構造器和_copy_value()方法,它簡單地一個新的值類型類的實例:

public:

CreateExceptionImpl() : OBV_CreateException() { }

virtual ~CreateExceptionImpl() { }

CORBA::ValueBase* _copy_value() {

return new CreateExceptionImpl();

}

我們也能夠為其它一些方法提供實現,如message()、localizedMessage()和toString():

CORBA::WStringValue* message() {

return new CORBA::WStringValue(CORBA::wstring_dup(L”javax::ejb::CreateException”));

}



CORBA::WStringValue* localizedMessage() {

return new CORBA::WStringValue(CORBA::wstring_dup(L”javax::ejb::CreateException”));

}



CORBA::WStringValue* toString() {

return new CORBA::WStringValue(CORBA::wstring_dup(L”javax::ejb::CreateException”));

}

};

接下來,我們定義工廠類CreateExceptionFactory。我們至少要實現create_for_unmarshal()方法,但是我們還要實現create__()方法。這兩個方法都返回一個新實現的類實例:

class CreateExceptionFactory: public ::javax::ejb::CreateException_init

{

public:

CreateExceptionFactory() { }

virtual ~CreateExceptionFactory() { }

javax::ejb::CreateException* create__() {

return new CreateExceptionImpl();

}

CORBA::ValueBase* create_for_unmarshal() {

return new CreateExceptionImpl();

}

};

最后,我們把工廠注冊到ORB上。ORB接口提供register_value_factory()方法,它接收庫ID號和工廠實例作為參數。我們可以從IDL中得到庫ID號(它由#pragma指示)。下面的例子示范了如何注冊CreateException:

orb->register_value_factory(“RMI:javax.ejb.CreateException:FD98A9711F66DF7F:575FB6C03D49AD6A”, (CORBA::ValueFactory)new CreateExceptionFactory);

我們簡單地實現了在CORBA客戶端中所需要的所有值類型。盡管這看起來有些復雜,但是你將會發現這個過程并不是很難而且你可以定義模板類來自動生成它。

7.開發一個更高級的CORBA客戶端
現在你對CORBA的值類型已經熟悉了,你可以為具有更復雜接口的EJB開發CORBA客戶端。

在這個例子中,我們用幾個使用了用戶自定義對象和固有的Java對象的方法來擴展CorbaEai會話Bean的接口。首先,我們添加sumObj()方法來將兩個Integer對象相加:

public Integer sumObj(Integer num1, Integer num2) throws RemoteException;

然后我們為一個可序列化的類MyType添加一個getter/setter操作對:

public MyType getMyType() throws RemoteException;

public void setMyType(MyType mt) throws RemoteException;

MyType類非常簡單,它包含兩個屬性(為簡單起見,我沒有列出相對應的getter/setter操作方法):

package eai;

import java.io.Serializable;

public final class MyType implements serializable {

public int a;

public double b;

}

最后,我們添加一個返回Java向量的方法getVector()和一個返回Java集合的方法getCollection():

public Vector getVector() throws RemoteException;

public Collection getCollection() throws RemoteException;

這些方法代表了大多數基于EJB的應用中的典型方法。完整的例子可以參見源代碼2。

開發這個CORBA客戶端的過程跟第一個例子相似。首先,我們生成IDL接口。我們使用跟前面一樣的命令;但是,這次我們不再簡化IDL。

注重,為會話Bean CorbaEai遠程組件接口生成的IDL接口遵循RMI/IDL映射屬性訪問方法的規則。使用JavaBean命名方式來讀寫/只讀屬性的方法沒有映射到IDL操作,而是映射到IDL屬性。在我們的例子中,我們有getMyType()和setMyType()讀寫屬性的方法和getVector()、getCollection()的只讀方法。這些方法映射到下面的IDL屬性:

attribute ::eai::MyType myType;

readonly attribute ::java::util::Vector vector;

readonly attritube ::java::util::Collection collection;

為了從C++訪問這些屬性,你必須知道它們是如何從IDL映射到C++(或者你選擇的其它語言)。對C++,每一個屬性映射到兩個重載的和屬性一樣名字的C++函數,一個用來設置屬性,一個用來讀取屬性。只讀屬性只映射到一個讀取函數。更具體的信息請參閱C++語言映射。

其它方法,如sum()和sumObj(),都是一對一地映射:

long sum(in long arg0, in long arg1);

::java::lang::Integer sumObj(in ::java::lang::Integer arg0, in ::java::lang::Integer arg1);

接下來,我們用ORBacus的idl編譯器把IDL接口編譯成C++。你可以一個一個地來編譯所有的IDL文件,也可以把所有的IDL文件放在一個文件中編譯。

現在,我們可以編寫C++客戶端的代碼。第一,按照我前面解釋的,為所有有關的值類型提供值類型的實現(值類型的類和工廠類)。在例子中,我們為下面這些值類型定義實現:

l MyType

l Integer

l Vector

l CreateException

l RemoveException

我們還要把這些值類型注冊到ORB。

你也許要希奇為什么我們沒有為Collection定義一個值類型。你知道,Collection是一個接口,它由類AbstractCollection實現,提供了一個框架性的實現。JavaSDK為更多的特定接口提供了實現,如List。為了理解這種類和接口之間的層次關系,請看以下的UML圖:



Collection的接口和實現類層次

你可以把Vector看成Collection接口的一個可能的實現,所以我們用它來訪問Collection。

實際上C++用來調用CorbaEai會話Bean方法的代碼是比較簡單的。為調用sumObj()方法,我們先創建兩個Integer值類型并插入數值,然后調用方法、輸出結果:

::java::lang::Integer_var javaInt1 = new IntegerImpl();

::java::lang::Integer_var javaInt2 = new IntegerImpl();

javaInt1->value(15);

javaInt2->value(20);

::java::lang::Integer_var javaIntR = ceai->sumObj(javaInt1, javaInt2);

cout << "sumObj(): " << javaIntR->value() << endl;

為了調用getMyType()和setMyType()方法,回憶一下它們是如何被映射到IDL屬性的。所以,我們用C++重載的方法myType()。下面的代碼調用會話Bean上的getMyType()方法:

::eai::MyType_var mt = ceai->myType();

cout << "getMyType(): " << mt << endl;

為了調用setMyType()方法,我們先創建一個MyType實例并填充必要的數值;剩下的就是調用它了:

cout << "setMyType()... " << endl;

::eai::MyType_var mt2 = new MyTypeImpl();

mt2->a((CORBA::Long)9);

mt2->b((CORBA::Double)9.9);

ceai->myType(mt2);

注重,這兒的方法名字已經變了,因為我們用的是JavaBean的命名方式(get/set方法)。否則,方法就不會改變。

對getVector()方法也是一樣,它被映射到一個只讀的IDL屬性。所以,我們用C++的vector()方法來訪問它:

::java::util::Vector_ptr vec = ceai->vector();

cout << "getVector(): " << vec << endl;

這個過程中最有趣的事情也許是我們如何訪問Collection的過程。調用會話Bean的getCollection()方法(在C++中是collection())后,我們把它顯式的轉換為一個Vector:

::java::util::Collection_ptr coll = ceai->collection();

::java::util::Vector_ptr cvec = ::java::util::Vector::_downcast(coll);

cout << "Collection: " << cvec << endl;

最后,注重,我們可以應用那些從EJBObject繼續來的遠程組件接口方法。如最重要的方法remove()。所以,我們可以得出結論我們的例子中有以下一行:

ceai->remove();

理想的集成

在本文中,我已經說明了在CORBA和EJB的的集成是可能的。但是,用非Java開發一個EBJ的客戶端并不象你所希望的那么簡單,尤其是當你使用那接收和返回對象或是用戶定義類型的方法。這是應用EJB組件的絕大多數情況,所以你必須使用CORBA的值類型。最主要的問題是你還要必須實現Java固有的類型。我希望CORBA的銷售商盡快提供值類型的實現,如IBM的WebSphere應用服務器。我也希望不同的CORBA產品之間的互操作問題能夠盡快解決。

無論如何,當你把一個現有的不是基于Java的應用跟新的基于J2EE的方案進行集成時,EJB和CORBA之間的互操作是十分重要和有用的。

譯者說明:

l 在第7節中,采用值類型,當用rmic把JAVA接口映射到IDL時,我使用了-noValueMethods,因為假如帶著該參數編譯出來的IDL文件要多一些,再映射到C++后,很難編譯過去。

l 即使使用-noValueMethods選項,最后生成的C++程序還是不能完全進行正常地編譯和運行(涉及到Java固有的那些類型:Integer、Vector、Collection),所以只好將一些語句屏蔽掉了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲91av视频| 午夜精品久久久久久99热| 国产成人亚洲综合青青| 日韩av电影院| 欧美极度另类性三渗透| 国产精品高清网站| 久久久91精品国产| 亚洲精品日产aⅴ| 欧美另类xxx| 亚洲伊人久久综合| 国产精品免费网站| 一区二区三区视频观看| 狠狠做深爱婷婷久久综合一区| 国产成人久久精品| 亚洲欧美日韩一区二区在线| 亚洲美女免费精品视频在线观看| 欧美午夜精品久久久久久人妖| 久久精品国产成人精品| 国产精品第一第二| 欧美一级大片视频| 成人免费淫片aa视频免费| 91精品久久久久| 亚洲精品在线观看www| 亚洲新中文字幕| 午夜伦理精品一区| 中文字幕久热精品在线视频| 欧美一区二区三区免费观看| 2019中文字幕全在线观看| 91视频免费在线| 日韩精品中文字幕久久臀| 亚洲精品按摩视频| 亚洲欧美日韩图片| 91精品视频大全| 欧美性videos高清精品| 欧美国产日韩一区二区| 国语对白做受69| 欧洲一区二区视频| 亚洲欧美国产日韩中文字幕| 亚洲男人的天堂在线播放| 亚洲日本中文字幕| 欧美激情第1页| 国产精品一二区| 在线观看国产精品淫| 日韩av影视综合网| 久久免费视频观看| 中文字幕av一区中文字幕天堂| 亚洲免费成人av电影| 一区二区三区四区视频| 国产精品日韩在线观看| 亚洲第一区中文99精品| 国产精品伦子伦免费视频| 亚洲国产精品一区二区久| 国产精品视频久久久| 最近的2019中文字幕免费一页| 亚洲天堂av在线免费观看| 亚洲美女av电影| 欧美日韩中文字幕在线视频| 国产精品青草久久久久福利99| 亚洲国产日韩欧美在线动漫| 在线观看欧美视频| 国产精品成人va在线观看| 日韩精品日韩在线观看| 91精品视频在线免费观看| 欧美肥婆姓交大片| 国产一区二区三区欧美| 国产精品香蕉在线观看| 精品国产成人av| 91久久精品视频| 欧美高清视频在线播放| 中文字幕日韩在线播放| 在线亚洲国产精品网| 欧美激情在线观看| 欧美一区二粉嫩精品国产一线天| 亚洲专区国产精品| 精品久久久久久久大神国产| 欧美激情videoshd| 91精品国产自产91精品| 国产精品一香蕉国产线看观看| 亚洲美女精品成人在线视频| 尤物99国产成人精品视频| 国产欧美一区二区白浆黑人| 精品视频偷偷看在线观看| 欧美黄色片视频| 国产91成人在在线播放| www高清在线视频日韩欧美| 91chinesevideo永久地址| 亚洲精品videossex少妇| 这里只有精品在线观看| 欧美日韩中文在线| 国产成人av在线播放| 国产日本欧美一区二区三区| 亚洲视频在线看| 国产色综合天天综合网| 国产成人在线精品| 欧美有码在线观看| 亚洲欧洲午夜一线一品| 国产精品黄色av| 久久久久久999| 91精品成人久久| 国产精品视频免费观看www| 午夜免费在线观看精品视频| 国产精品亚洲精品| 亚洲欧美在线第一页| 久久99视频免费| 国产精彩精品视频| 一本色道久久88亚洲综合88| 精品久久久av| 亚洲第一中文字幕| 国产在线拍揄自揄视频不卡99| 国产成人高清激情视频在线观看| 国产成人激情小视频| 精品中文视频在线| 欧美精品国产精品日韩精品| 亚洲www永久成人夜色| 久久伊人精品天天| 性欧美长视频免费观看不卡| 69久久夜色精品国产69| 久久精品色欧美aⅴ一区二区| **欧美日韩vr在线| 992tv在线成人免费观看| 日韩精品在线观看网站| 国产精品免费小视频| 成人写真视频福利网| 国产精品久久91| 国产欧美精品一区二区三区介绍| 亚洲情综合五月天| 97久久国产精品| 国内精品模特av私拍在线观看| 久久综合免费视频影院| 国产精品久久久久久久久久| 日韩精品在线观看一区二区| 亚洲福利影片在线| 精品性高朝久久久久久久| 久久久久久亚洲精品| 亚洲成人xxx| 九九热最新视频//这里只有精品| 国产精品久久不能| 97在线免费观看视频| 26uuu另类亚洲欧美日本一| 日韩成人av在线播放| 国产精品男人爽免费视频1| 91中文字幕一区| 色婷婷**av毛片一区| 欧美亚洲激情视频| 96pao国产成视频永久免费| 成人网欧美在线视频| 国产精品看片资源| 91久久久在线| 91色视频在线导航| 亚洲一区二区久久久久久久| 亚洲视频免费一区| 欧美在线观看视频| 久久色在线播放| 久久久精品电影| 在线观看久久久久久| 久久视频这里只有精品| 亚洲97在线观看| 在线视频欧美性高潮| 欧美亚洲第一页| 日韩精品在线免费观看| 亚洲国产一区自拍| 国产一区二区在线免费视频| 亚洲精品福利视频| 91成人福利在线|