使用Java进行CORBA编程-JacORB-入门
使用Java进行CORBA编程-JacORB-入门
到http://www.jacorb.org/download.html下载JacORB3.0Beta。
下面开发一个简单的应用。
首先需要定义IDL文件。例如:
- module learning {
- module corba {
- module bookstore {
- struct Author {
- string firstName;
- string lastName;
- };
- struct Book {
- string name;
- double price;
- };
- typedef sequence<Book> BookList;
- struct SearchCondition {
- string name;
- any value;
- };
- exception NotFound{};
- interface BookQuery {
- void search(in SearchCondition condition, out BookList bookList)
- raises (NotFound);
- };
- interface ClientCallback;
- interface CallbackServer {
- void registerCallback(in ClientCallback cc);
- void callback_notifyMsg(in string msg);
- };
- interface ClientCallback {
- void notifyMsg(in string msg);
- };
- };
- };
- };
在Eclipse里面,可以通过下面的XML配置执行ANT Build编译IDL文件。
[html]- <project name="common-demo" default="idl">
- <property name="idl.dir" value="." />
- <property name="gen.dir" value="../../.." />
- <property name="resources.dir" value="resources" />
- <property name="jacorb.dir" value="../../../../../jacorb-3.0beta1" />
- <path id="jacorb.classpath" >
- <fileset dir="${jacorb.dir}/lib">
- <include name="*.jar" />
- </fileset>
- </path>
- <target name="idl.taskdef">
- <taskdef name="jacidl" classname="org.jacorb.idl.JacIDL" classpathref="jacorb.classpath"/>
- </target>
- <target name="idl" depends="idl.taskdef">
- <jacidl srcdir="${idl.dir}" destdir="${gen.dir}" includes="*.idl" helpercompat="jacorb"
- includepath="${jacorb.dir}/idl/omg" />
- </target>
- </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对象中存放的对象的类型。
|
评论暂时关闭