使用Java进行CORBA编程-JacORB-入门


http://www.jacorb.org/download.html下载JacORB3.0Beta。
下面开发一个简单的应用。

首先需要定义IDL文件。例如:

[cpp]  
  1.   module learning {  
  2.   module corba {  
  3.         module bookstore {  
  4.             struct Author {  
  5.                 string firstName;  
  6.                 string lastName;  
  7.             };  
  8.               
  9.             struct Book {  
  10.                 string name;  
  11.                 double price;  
  12.             };  
  13.             typedef sequence<Book> BookList;  
  14.               
  15.             struct SearchCondition {  
  16.                 string name;  
  17.                 any value;  
  18.             };  
  19.               
  20.             exception NotFound{};  
  21.               
  22.             interface BookQuery {  
  23.                 void search(in SearchCondition condition, out BookList bookList)  
  24.                     raises (NotFound);  
  25.             };  
  26.               
  27.             interface ClientCallback;  
  28.             interface CallbackServer {  
  29.                 void registerCallback(in ClientCallback cc);  
  30.                 void callback_notifyMsg(in string msg);  
  31.             };  
  32.               
  33.             interface ClientCallback {  
  34.                 void notifyMsg(in string msg);  
  35.             };  
  36.         };  
  37.     };  
  38. };   

在Eclipse里面,可以通过下面的XML配置执行ANT Build编译IDL文件。

[html]
  1. <project name="common-demo" default="idl">  
  2.     <property name="idl.dir"        value="." />  
  3.     <property name="gen.dir"        value="../../.." />  
  4.     <property name="resources.dir"  value="resources" />  
  5.           
  6.     <property name="jacorb.dir"     value="../../../../../jacorb-3.0beta1" />  
  7.   
  8.     <path id="jacorb.classpath" >  
  9.         <fileset dir="${jacorb.dir}/lib">  
  10.             <include name="*.jar" />  
  11.         </fileset>  
  12.     </path>  
  13.   
  14.     <target name="idl.taskdef">  
  15.         <taskdef name="jacidl" classname="org.jacorb.idl.JacIDL" classpathref="jacorb.classpath"/>  
  16.     </target>  
  17.   
  18.     <target name="idl" depends="idl.taskdef">  
  19.         <jacidl srcdir="${idl.dir}" destdir="${gen.dir}" includes="*.idl" helpercompat="jacorb"  
  20.            includepath="${jacorb.dir}/idl/omg" />  
  21.     </target>  
  22. </project>  

对于struct,生成3个文件。以Author为例,
Author.java
AuthorHelper.java  -> 用来从Any对象中extract出Author对象/向Any对象中insert Author对象
AuthorHolder.java  -> 用于输出参数

如果定义了sequence,还会得到*ListHelper.java和*ListHolder.java文件。

对于interface,除了上面的3个文件,还生成3个文件。以BookQuery为例:
BookQueryOperations.java ->定义我们的interface
BookQueryPOA.java ->BookQuery服务的提供者(Servant),我们的代码需要继承这个类
BookQueryPOATie.java ->如果我们的服务实现类没有没有继承BookQueryPOA类,直接实现BookQueryOperations接口,需要通过BookQueryPOATie来转换为一个Servant对象。

接下来可以分别进行Server端和Client端的编码。

Server
Server端的一般步骤如下:
1)新建1个类,继承自*POA类。在其中实现所有提供的接口。
接下来在Server端的main方法中,
2)调用ORB.init()这个静态方法,初始化ORB并得到一个ORB对象。
3)在ORB对象上调用resolve_initial_references("RootPOA"))方法,获得root POA,然后激活它。或者创建1个新的POA,激活这个POA。
4) 在ORB对象上调用resolve_initial_references("NameService"))方法,获得NameService的引用。
5)创建我们的服务提供对象,向NameService注册,注册时提供一个服务名。
6)调用ORB对象的run方法。

Client
Client端的一般步骤如下:
在Client端的main方法中,
1)调用ORB.init()这个静态方法,初始化ORB并得到一个ORB对象。
2) 在ORB对象上调用resolve_initial_references("NameService"))方法,获得NameService的引用。
3)提供服务名,向NameService查询并得到服务提供者的代理。
4)调用服务。

Any对象
对于Any对象,首先使用ORB对象的create_any方法生成1个Any对象,然后可以使用*Helper类的extract/insert方法抽取/插入一个对象。
可以使用Any对象的type方法获得这个Any对象中存放的对象的类型。

  • 1
  • 2
  • 3
  • 下一页

相关内容