EJB和CORBA
![](/icons/15344de.gif)
集成能力对于集成基于JAVA或非JAVA
![](/icons/15344de.gif)
应用来说是很重要
![](/icons/15344de.gif)
![](/icons/15344dou2.gif)
本文描述了如何实现
![](/icons/15344yi.gif)
个EJB和
![](/icons/15344yi.gif)
个CORBA
![](/icons/15344de.gif)
C
![](/icons/15344jiajia.gif)
应用相集成
![](/icons/15344dou2.gif)
它阐述了几个重要
![](/icons/15344de.gif)
集成问题
![](/icons/15344dou.gif)
尤其是那些EJB采用JAVA固有
![](/icons/15344de.gif)
或是用户定义
![](/icons/15344de.gif)
对象作为参数或返回值
![](/icons/15344de.gif)
思路方法时涉及
![](/icons/15344de.gif)
问题
![](/icons/15344dou2.gif)
EJB对于用JAVA来开发关键业务应用
![](/icons/15344chengxu.gif)
是非常重要
![](/icons/15344de.gif)
![](/icons/15344dou2.gif)
但是
![](/icons/15344dou.gif)
业务应用不是孤立存在
![](/icons/15344de.gif)
![](/icons/15344dou.gif)
当今
![](/icons/15344dou.gif)
企业需要集成各种应用
![](/icons/15344dou2.gif)
从而
![](/icons/15344dou.gif)
把基于EJB
![](/icons/15344de.gif)
解决方案和现有
![](/icons/15344de.gif)
应用系统集成起来就变得越来越重要了
![](/icons/15344dou2.gif)
在本文中
![](/icons/15344dou.gif)
我将介绍说明如何从
![](/icons/15344yi.gif)
个非JAVA语言编写
![](/icons/15344de.gif)
应用中访问EJB
![](/icons/15344dou2.gif)
更加特别地是
![](/icons/15344dou.gif)
我将讨论从
![](/icons/15344yi.gif)
个CORBA
![](/icons/15344de.gif)
C
![](/icons/15344jiajia.gif)
客户端访问会话和实体Bean(它使用同步
![](/icons/15344de.gif)
IIOP协议进行通信)
![](/icons/15344dou2.gif)
我没有提到消息驱动Bean
![](/icons/15344dou.gif)
尽管你可能想从其它语言编写
![](/icons/15344de.gif)
应用中使用MOM产品来访问它们
![](/icons/15344dou2.gif)
1、RMI-IIOP
会话Bean和实体Bean使用远程思路方法
![](/icons/15344diaoyong.gif)
(RMI)来进行同步通信
![](/icons/15344dou2.gif)
J2EE1.3要求JAVA客户端使用RMI-IIOP
![](/icons/15344dou2.gif)
RMI-IIOP采用CORBA
![](/icons/15344de.gif)
IIOP协议
![](/icons/15344dou.gif)
这使得RMI-IIOP和CORBA相兼容
![](/icons/15344dou2.gif)
换句话说
![](/icons/15344dou.gif)
不是基于JAVA开发
![](/icons/15344de.gif)
客户端可以通过CORBA和EJB进行通信
![](/icons/15344dou2.gif)
要实现这点
![](/icons/15344dou.gif)
你必须使用符合J2EE1.3
![](/icons/15344de.gif)
应用服务器
![](/icons/15344dou2.gif)
以前
![](/icons/15344de.gif)
EJB规范标准没有要求你去用RMI-IIOP协议
![](/icons/15344dou2.gif)
而是
![](/icons/15344dou.gif)
应用服务器采用了RMI-JRMP或是其它私有协议
![](/icons/15344dou2.gif)
另外
![](/icons/15344dou.gif)
你必须使用符合CORBA2.3.1或更高版本
![](/icons/15344de.gif)
ORB
![](/icons/15344dou2.gif)
以前
![](/icons/15344de.gif)
CORBA版本没有实现和RMI-IIOP协议进行互操作所必需
![](/icons/15344de.gif)
规范标准
![](/icons/15344dou.gif)
尤其是后来集成中CORBA规范标准和JAVA到IDL
![](/icons/15344de.gif)
语言映射规范标准中
![](/icons/15344de.gif)
用值传递对象
![](/icons/15344de.gif)
规范标准
![](/icons/15344dou2.gif)
值类型语言增加了用值来传递对象
![](/icons/15344de.gif)
概念
![](/icons/15344dou.gif)
是由RMI引来
![](/icons/15344dou.gif)
加入到CORBA中
![](/icons/15344de.gif)
![](/icons/15344dou2.gif)
CORBA最初并不支持这项功能;但是
![](/icons/15344dou.gif)
这个概念对于实现JAVA和CORBA的间
![](/icons/15344de.gif)
互操作是至关重要
![](/icons/15344de.gif)
![](/icons/15344dou2.gif)
JAVA到IDL语言映射规范标准定义了如何把JAVA接口映射到CORBA
![](/icons/15344de.gif)
IDL语言
![](/icons/15344dou2.gif)
这个定义使CORBA分布对象可以访问本来不具有CORBA
![](/icons/15344de.gif)
IDL
![](/icons/15344de.gif)
EJB(还有那些RMI-IIOP分布对象)
![](/icons/15344dou2.gif)
特别
![](/icons/15344de.gif)
是
![](/icons/15344dou.gif)
这个规范标准定义了
![](/icons/15344yi.gif)
个JAVA
![](/icons/15344de.gif)
RMI子集
![](/icons/15344dou.gif)
叫RMI/IDL
![](/icons/15344dou.gif)
它可以让你映射到IDL
![](/icons/15344dou.gif)
用IIOP(或是更通用
![](/icons/15344dou.gif)
是GIOP协议)作为通信
![](/icons/15344de.gif)
底层协议
![](/icons/15344dou2.gif)
2、RMI/IDL
许多RMI/IDL数据类型遵循
![](/icons/15344yi.gif)
定
![](/icons/15344de.gif)
约束;我们来看
![](/icons/15344yi.gif)
下那些最重要
![](/icons/15344de.gif)
类型
![](/icons/15344dou2.gif)
更详细
![](/icons/15344de.gif)
信息
![](/icons/15344dou.gif)
请参看JAVA到IDL
![](/icons/15344de.gif)
语言映射规范标准
![](/icons/15344dou2.gif)
表1显示了JAVA基本类型到IDL
![](/icons/15344de.gif)
映射
![](/icons/15344dou2.gif)
表1:JAVA到IDL
![](/icons/15344de.gif)
映射
Java OMG IDL
void void
boolean boolean
char wchar
![](/icons/15344byte.gif)
octet
long long
float float
double double
JAVA包映射为IDL
![](/icons/15344de.gif)
模块
![](/icons/15344dou2.gif)
RMI/IDL中
![](/icons/15344de.gif)
远程接口映射为IDL
![](/icons/15344de.gif)
接口并具有相对应
![](/icons/15344de.gif)
名字
![](/icons/15344dou2.gif)
但是
![](/icons/15344dou.gif)
那些用JavaBean命名方式用来只读或读写属性
![](/icons/15344de.gif)
思路方法被映射为IDL
![](/icons/15344de.gif)
属性
![](/icons/15344dou2.gif)
后面我将提到这个
![](/icons/15344dou2.gif)
JAVA中可序列化
![](/icons/15344de.gif)
对象映射为CORBA
![](/icons/15344de.gif)
值类型
![](/icons/15344dou2.gif)
值类型为CORBA提供了用值来进行传递
![](/icons/15344de.gif)
语义
![](/icons/15344dou2.gif)
值类型是属于本地
![](/icons/15344de.gif)
![](/icons/15344dou.gif)
不能被远程
![](/icons/15344diaoyong.gif)
![](/icons/15344dou2.gif)
它们不注册到ORB中
![](/icons/15344dou.gif)
也不需要标识符
![](/icons/15344dou.gif)
![](/icons/15344yinwei.gif)
它们
![](/icons/15344de.gif)
值就是它们
![](/icons/15344de.gif)
标识符
![](/icons/15344dou2.gif)
更详细
![](/icons/15344de.gif)
信息
![](/icons/15344dou.gif)
请参阅
![](/icons/15344smhl.gif)
Professional J2EE EAI
![](/icons/15344smhr.gif)
和CORBA/IIOP规范标准2.6版
![](/icons/15344dou2.gif)
就象我已经提到过
![](/icons/15344de.gif)
![](/icons/15344dou.gif)
所有
![](/icons/15344de.gif)
JAVA或序列化
![](/icons/15344de.gif)
对象
![](/icons/15344dou.gif)
包括JAVA固有
![](/icons/15344de.gif)
和用户定义
![](/icons/15344de.gif)
![](/icons/15344dou.gif)
都将映射为值类型
![](/icons/15344dou2.gif)
但是
![](/icons/15344dou.gif)
这个规则也有
![](/icons/15344yi.gif)
些例外----例如
![](/icons/15344dou.gif)
当你想把java.lang.String映射到IDL时
![](/icons/15344dou2.gif)
如果把它定义为常量(final
![](/icons/15344static.gif)
)
![](/icons/15344dou.gif)
这个对象将被映射为IDL
![](/icons/15344de.gif)
w
![](/icons/15344string.gif)
![](/icons/15344dou2.gif)
在其它情况下
![](/icons/15344dou.gif)
包括作为思路方法
![](/icons/15344de.gif)
参数或返回值
![](/icons/15344dou.gif)
该对象都被映射为值类型CORBA::WStringValue
![](/icons/15344dou2.gif)
这个值类型是CORBA模块
![](/icons/15344de.gif)
![](/icons/15344yi.gif)
部分
![](/icons/15344dou.gif)
它
![](/icons/15344de.gif)
IDL定义如下:
valuetype WStringValue w
;
这等同于下面
![](/icons/15344de.gif)
IDL定义:
valuetype WStringValue
{
public w
data;
};
但是
![](/icons/15344dou.gif)
要记住
![](/icons/15344dou.gif)
第
![](/icons/15344yi.gif)
种定义能够更干净地映射到JAVA
![](/icons/15344dou2.gif)
表2列出其它特殊
![](/icons/15344de.gif)
映射情况
![](/icons/15344dou2.gif)
表2:其它重要
![](/icons/15344de.gif)
特殊映射情况
Java OMG IDL
java.lang.Object ::java::lang::_Object
java.lang.String ::CORBA::WStringValue or w
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、实现集成
后面我将返回来讨论值类型
![](/icons/15344dou.gif)
先讨论用户定义
![](/icons/15344de.gif)
类
![](/icons/15344dou.gif)
再讨论内嵌
![](/icons/15344de.gif)
类
![](/icons/15344dou.gif)
如Vectors、Collections和Enumerations
![](/icons/15344dou2.gif)
现在
![](/icons/15344dou.gif)
让我们看
![](/icons/15344yi.gif)
下CORBA和EJB集成
![](/icons/15344de.gif)
基本方式
![](/icons/15344dou2.gif)
首先
![](/icons/15344dou.gif)
我们需要
![](/icons/15344yi.gif)
个EJB
![](/icons/15344dou2.gif)
在第
![](/icons/15344yi.gif)
个例子中
![](/icons/15344dou.gif)
我们使用
![](/icons/15344yi.gif)
个简单
![](/icons/15344de.gif)
会话Bean
![](/icons/15344dou.gif)
它只使用简单
![](/icons/15344de.gif)
数据类型作为思路方法
![](/icons/15344de.gif)
参数和返回值
![](/icons/15344dou2.gif)
我们没有强行去用值类型
![](/icons/15344dou2.gif)
(注意:从CORBA客户端访问实体Bean跟访问会话Bean
![](/icons/15344de.gif)
过程
![](/icons/15344yi.gif)
样
![](/icons/15344dou2.gif)
)
这个方式是最简单
![](/icons/15344de.gif)
;但是
![](/icons/15344dou.gif)
你不能把它用在复杂
![](/icons/15344de.gif)
接口上
![](/icons/15344dou2.gif)
它
![](/icons/15344de.gif)
好处是:你可以使用不支持值类型
![](/icons/15344de.gif)
ORB
![](/icons/15344dou2.gif)
许多CORBA产品都是这样(不支持值类型)
![](/icons/15344dou.gif)
尤其是那些不是用C
![](/icons/15344jiajia.gif)
实现
![](/icons/15344de.gif)
产品
![](/icons/15344dou2.gif)
这个例子中
![](/icons/15344dou.gif)
我将使用C
![](/icons/15344jiajia.gif)
版本
![](/icons/15344de.gif)
ORBacus4.1.0作为CORBA
![](/icons/15344de.gif)
ORB
![](/icons/15344dou.gif)
使用VC
![](/icons/15344jiajia.gif)
6.0作为编译客户端代码
![](/icons/15344de.gif)
编译器
![](/icons/15344dou2.gif)
为部署这个例子中
![](/icons/15344de.gif)
EJB
![](/icons/15344dou.gif)
我将使用JBoss3.0.0
![](/icons/15344dou2.gif)
你可以从网上下载ORBacus4.1.0(也可以从IONA网站WebSite上下载)和JBoss3.0.0
![](/icons/15344dou2.gif)
你可以使用任何支持CORBA2.3.1或更高版本
![](/icons/15344de.gif)
ORB产品(只要它支持到C
![](/icons/15344jiajia.gif)
![](/icons/15344de.gif)
映射)、
![](/icons/15344yi.gif)
个相对应
![](/icons/15344de.gif)
C
![](/icons/15344jiajia.gif)
编译器和
![](/icons/15344yi.gif)
个支持J2EE1.3规范标准
![](/icons/15344de.gif)
应用服务器
![](/icons/15344dou2.gif)
理论上讲不需要修改代码;但是
![](/icons/15344dou.gif)
如果你使用其它产品
![](/icons/15344dou.gif)
小
![](/icons/15344de.gif)
改动可能是必要
![](/icons/15344de.gif)
延伸阅读
最新评论