Enterprise JavaBeans组件慨述(7)
CORBA 和 EJB 技术的关系
公用对象请求代理程序体系结构 (CORBA) 为分布式对象的平台中立和语言中立的计算环境奠定了基础。在 CORBA 环境中,功能驻留于对象之中,而客户机可通过对象请求代理程序 (ORB) 访问这些对象。完整的 CORBA 实现提供 ORB,外加称为 CORBA 对象服务和 CORBA 公用工具的几个运行时服务。也可只提供 ORB,不提供相关联的对象服务和公用工具(例如,IBM 就提供这样的两种独立 ORB)。实现基本 ORB 功能的软件称为 ORB 核心。为了支持语言无关性,CORBA 应用程序是用接口定义语言 (IDL) 编写的。该语言在语法上类似于 C++,但不包含语义:IDL 中指定的操作是操作接口,而不是操作实现。由于它对多种平台和多种语言的支持,以及源自其分布式特征的可伸缩性,CORBA 非常适合于治理企业规模的信息系统。
设计 EJB 规范也是为了支持企业信息系统。这样说来,CORBA 是一个竞争者吗?根据 Frequently Asked Questions for Enterprise JavaBeans,答案是否定的:
“实际上,EJB 技术很好地补充了 CORBA。CORBA 提供了一个强大的基于标准的基础结构,可在此结构之上构建 EJB 服务器。EJB 技术使得在 CORBA 基础结构的顶层构建应用程序变得更为轻易。”(Enterprise JavaBeans 常见问题解答)
虽然 EJB 规范和 CORBA 规范说明的是不同的技术,但 EJB 实现目前利用 CORBA 技术的某些方面。一个例子就是 RMI/IIOP。EJB 规范要求 EJB 组件及其容器使用 Remote Method Invocation (RMI) 技术,实现分布式对象之间的方法调用。 RMI 规定远程方法的语法和语义,但并不规定应使用何种传输协议提供网络连接。CORBA Internet 对象请求代理程序间协议 (IIOP) 基本上定义了通过 TCP/IP 传输 CORBA 消息的一种方法。开发使用 IIOP 消息形式交换 RMI 数据的 EJB 实现,说明了 EJB 应用程序怎样才能有效地使用 CORBA 技术的各部分。这种网络也支持与 CORBA 应用程序的互操作性,后者使用 IIOP 发送本地 CORBA 消息,与 RMI 无关。IBM 的 EJB 实现,即 WebSphere Application Server,优化了 IIOP 的使用,方法是,弄清楚分布式对象何时驻留在同一台服务器上,并且只在对象确实在远程时才调用 IIOP。
为了方便既并入 EJB 技术,又并入 CORBA 技术的企业系统的开发,Sun Microsystems 在 EJB 规范和 CORBA 之间创建了一种映射。将 EJB 体系结构映射到 CORBA,影响到 EJB 技术的几个方面,包括对象分布、命名和事务。CORBA 映射的主要目的是,保证不同厂商构建的 EJB 服务器之间的互操作性。互操作性提供以下好处:
CORBA 客户机可以访问部署在基于 CORBA 的 EJB 服务器上的 EJB 组件
客户机程序在事务中可以将对 CORBA 对象的调用,与对企业级 bean 的调用混合在一起
事务可以跨多个 bean,而这些 bean 又位于来自不同厂商的基于 CORBA 的多台 EJB 服务器上
使用来自某个厂商的 ORB 的客户机,可以访问另一个厂商基于 CORBA 的 EJB 服务器上的 bean
对于要访问 EJB 组件的 CORBA 客户机来说,bean 接口被映射到 IDL。例如,可将股票交易 bean 中定义的 buy() 和 sell() 方法,指定为 IDL 文件中的 CORBA 操作。非 bean 的 CORBA 客户机,如 C++ 客户机,可以访问这个 bean,并用标准 CORBA 调用来调用 bean 的方法。假如容器使用 IIOP 作为它的分布式对象协议,则该容器的职责是,生成与企业级 bean 及其接口对应的 IDL。
EJB 命名服务,它以“CORBA 对象服务”命名服务为基础,使 EJB 组件可用于 CORBA 客户机。Java Naming and Directory Interface (JNDI) 可提供到 CORBA 命名服务的接口,同时,客户机既可以通过 JNDI 调用间接访问基础命名服务,也可以通过“CORBA 对象服务” (COS) 命名 API 直接访问该服务。
EJB 事务支持依靠于 CORBA Transaction Service,即 Object Transaction Service (OTS)。Java Transaction Service (JTS) 代表 OTS 的 Java 绑定,它是语言中立的。基于 CORBA 的 EJB 容器必须识别 CORBA 客户机通过 OTS 接口发出的事务边界,以及 EJB 应用程序通过 Java Transaction API (JTA) 接口发出的事务,JTA 是到 JTS 的应用程序级接口。JTA 还代表 Open Group XA 接口的 Java 绑定,以便将应用程序资源连接到外部事务治理器。JIA 中含存的 javax.transaction.UserTransaction 接口,为事务边界的应用程序级控制提供 API。UserTransaction 接口,既可由其事务属性设置为 TX_BEAN_MANAGED 的 bean 使用,以可由 Java 客户机使用。