CORBA and RMI-IIOP
与corba联合使得EJB的客户可以方便的移植corba应用程序。使EJB与已存在的非java语言的(例如C++、COBOL)现有系统整合起来。实事上,Corba和EJB有非常密切的联系。J2EE中许多的概念来源于corba.
Corba是EJB的基础
许多的EJB的概念都来自于corba。EJB和J2EE带来的是java为中心的,基于组件的,适合快速应用开发的中间件程序结构。使用corba,要求写复杂的中间件API的程序,这无疑要求增加对于corba程序的了解程度。这就是为什么EJB和J2EE比corba更时候快速开发的原因。因为EJB正式被行业支持。(有25家之多正在同时开发EJB产品)。
尽管如此,corba还是非常重要的技术。对高级中间件开发非常有用。事实上,市场上大多数的EJB产品都基于corba,同时也在大量的使用corba的概念。
我们为什么要关心corba
You can use CORBA for legacy integration.
CORBA allows for advanced middleware development.
CORBA and EJB have hooks connecting them.
使用corba的益处
corba不受某个公司控制
corba是独立于语言的
Corba提供增加服务的可选性
Corba的缺点
Corba的发展受到限制:因为是一个组织,因此对于某些新特征,OMG采用的比较慢。
Corba不宜于学习
基于corba的产品可以有不协调的特征。
Corba如何工作
The ORB facilitates your networking needs.
对象实现和对象参考
对象适配器
仓库:接口仓库和实现仓库
OMG的接口定义语言
语言映射(idl-java/idl-c++)
静态调用
Calling a method in CORBA.
动态调用
corba的各种服务
名字服务/事件服务/对象事务服务/并发控制服务/安全服务
corba组件
参考规范ftp://ftp.omg.org/pub/docs/orbos/98-12-02.pdf
IIOP之上的RMI
RMI和corba协同性的需要
Corba是分布式对象的标准,RMI可以方便的建立基于java的简单分布式对象通讯。RMI没有corba的多语言性,但非常适合纯java的开发。
虽然RMI和corba非常相似,但它们也有不相容的一面,当用java RMI编写代码时,需要使用RMI API。而用corba编代码时,必须使用corba API。这对于代码重用是非常不利的。理想上,我们希望:
将客户端java RMI与服务端的corba结合:可以通过corba API写对象实现,用RMI API写的客户端代码可以调用corba对象。
RMI的客户端调用corba对象的实现
反之也可以。
A CORBA client calling an RMI remote object implementation.
Corba和rmi的结合
Corba和rmi使用预生成的stubs和skeletons执行网络通讯。
在幕后,corba使用iiop作为执行C/S通讯的协议。这在stub/skeleton层之下。
在幕后,java RMI使用java远程方法调用协议(JRMP)执行C/S通讯,这在stub/skeleton层之下。
因此,corba和rmi在如何执行远程调用是非常相似的。它们都有一个API(stub/skeletons)层。分别通过iiop和jrmp传输数据。
因此协议的使用成为corba和rmi协同的关键。Rmi总是期待着通过jrmp协议的请求,而corba则期待iiop协议的请求。要实现两种协议的切换,可以执行:
1、 rmi客户端使用rmi api编写。在rmi stub上调用一个方法。
2、 rmi stub联系一个本地的orb,使用iiop作为服务方通讯的本地协议,代替标准的jrmp协议。
3、 在服务方,orb等待接受iiop的请求,orb是对于corba对象实现的纯的corba skeleton。Orb接收请求。因为使用iiop,请求看来好像来自corba的客户端。事实上它来自使用iiop协议的rmi客户端
4、 orb传递请求给corba skeleton,这代表着corba对象实现的调用。
5、 当调用完成时,返回的结果被回馈给纯corba skeleton。Orb将结果送回iiop.
6、 客户端的orb接受通过iiop返回的结果,返回给rmi客户端的stub然后将控制权返回给rmi的客户代码。
这样是完美的。因为它使用java客户端通过rmi api调用corba对象上的方法,相反,也是完美的。
Iiop之上的rmi的优点:
Rmi和corba代码实现了可复用性。
可已用多种语言来写代码调用rmi对象实现。
Rmi客户端可以被整合到系统中去。
IIOP gives RMI robust firewall navigation.
IIOP gives RMI a portable way to propagate contexts.
RMI object implementations can be invoked dynamically.
整合rmi和corba时出现的问题
参数传递约定的不同
解决办法:The OMG Objects-by-Value Specification
If the parameter is primitive or implements java.io.Serializable, it is
passed by value.
If the parameter implements java.rmi.Remote, it is passed by reference.
Rmi和corba语义的不同
Distributed garbage collection.
Narrowing.
Java RMI programmers don’t want to learn OMG IDL.
解决办法:The Java-to-IDL Mapping Specification
rmi和corba协同工作的实例:
带corba对象实现的rmi-iiop客户端
1、 写rmi远程接口
2、 生成iiop stubs之上的客户端rmi
3、 生成omg idl
4、 生成服务器端需要的corba文件
5、 书写客户端和服务端
带rmi-iiop对象实现的corba客户端
1、 写rmi远程接口
2、 生成iiop skeleton之上的服务端rmi
3、 生成omg idl
4、 生成所需的客户端corba文件
5、 写客户和服务端
使用rmi-iiop可能的组合
rmi-iiop API
javax.rmi.
javax.rmi.CORBA.
iiop之上的rmi客户端怎样找到网络上的对象呢?客户端可以使用rmi的naming.lookup()找到对象。
Corba和ejb整合
Corba和ejb整合的优点
这正在发展的幼年期。
Corba和ejb整合的设想
基于corba的ejb服务端
纯粹的ejb服务端
Java RMI-IIOP client with a CORBA-based EJB server.