CORBA技术诞生至今,已有十余年时间。十余年,对于IT界显得过于漫长。许多技术在十余年后看来可能都显得有些过时、落后。CORBA曾经在2000年左右辉煌过,现在却被网格、SOA、Web2.0等技术压得抬不起头。然而在学术界,CORBA还是有研究人员在学习使用,譬如某团队通过AOP技术对目标软件系统注入CORBA服务程序实现软件分布式监控。CORBA本身的技术在中间件中是比较领先的。然而,其被人所诟病之处在于其的复杂性。人们常说,CORBA复杂,不好用。其实CORBA本身的设计理念是很简单的,说它复杂的人是没有领会这简单设计理念背后的深邃思想。在这个系列中,我将尽可能以简单的例子来阐述CORBA的设计思想。
系列一:互操作
假设某企业有两套软件系统,一套使用JAVA开发,另一套系统使用C++开发。现在JAVA软件子系统想访问C++软件子系统的一个高密度科学计算服务。如何最快的实现这两个语言异构系统的互联。这就是一个最简单的互操作例子。在传统的企业计算环境中,常常会面对异构操作系统、异构编程语言、异构网络等情况。如何实现在异构系统中的软件模块无缝、平滑的互操作是软件系统集成面临的关键问题。CORBA第一个准确提出了什么是互操作,如何实现互操作。对于CORBA互操作的概念我在这里不阐述过多。这里,只以异构编程语言为例说明互操作。CORBA提出语言中立的接口描述语言IDL来解决互操作。开发人员在软件设计阶段定义好IDL接口,然后通过不同的IDL映射工具翻译成目标语言,在编码实现。下面看一个例子。
JAVA和C++互操作的例子:HelloWorld。服务器端有个Hello服务程序,对外提供方法hello_world。客户程序调用这个方法在服务端输出信息。
先看IDL描述
Hello.idl
interface Hello
{
void hello_world();
};
一)、C++服务程序
使用ORB厂商自带的IDL编译器生成对象存根、服务程序框架和实现框架,在控制台输入命令
idl --impl Hello.idl,--impl选项告诉编译器我想得到实现代码框架。编译完毕后生成六个文件
对象存根Hello.h,Hello.cpp
服务对象框架Hello_skel.h,Hello_skel.cpp
服务实现类Hello_impl.h,Hello_impl.cpp
我们不用关心对象存根和服务对象框架是如何实现的,我们只要按照传统的软件开发方法实现Hello_impl.cpp即可。
让我们看一下IDL编译器生成的Hello_impl头文件
#define ___Hello_impl_h__
#include < Hello_skel.h >
//
// Interface declare ::Hello
//
class Hello_impl : virtual public POA_Hello,
virtual public PortableServer::RefCountServantBase
... {
Hello_impl(const Hello_impl&);
void operator=(const Hello_impl&);
PortableServer::POA_var poa_;
public:
Hello_impl(PortableServer::POA_ptr);
~Hello_impl();
virtual PortableServer::POA_ptr _default_POA();
//
// Operation declare hello_world
//
virtual void hello_world()
throw(CORBA::SystemException);
} ;
#endif
为了说明的简单起见,我们只看公有方法
1)构造函数Hello_impl(PortableServer::POA_ptr);
参数PortableServer是CORBA规范中的可移植对象适配器,CORBA规范中指出,一个服务对象必须被一个可移植对象适配器管理。其它更加详细的说明留在后续专题。
2)virtual void hello_world() throw(CORBA::SystemException);
这就是我们关心的实现方法。因为分布式程序的脆弱性,必须在声明时指出可能出现的异常。这里使用CORBA规范中的SystemException。
实现这个方法,我们只是在服务器端输出一行信息。
Hello_impl::hello_world()