使用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文件。

<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对象中存放的对象的类型。

回调
可以通过CORBA实现回调。
实际上回调等同于Client提供一个服务,Server端调用Client提供的服务。
因此,客户端需要实现回调服务,并且需要获得root POA,然后激活它。或者创建1个新的POA,激活这个POA。

下面是提供的例子的代码。
运行此例子的步骤:
1)启动NameService。
Windows上到JacORB的安装目录下的bin,执行以下命令来启动NameService。需要指定一个端口,这里是7980。
注意,如果启动中出现错误,可能需要修改etc/jacorb.properties文件中的某些设置。

set CLASSPATH=. set CLASSPATH=%CLASSPATH%;../lib/slf4j-api-1.6.4.jar set CLASSPATH=%CLASSPATH%;../lib/slf4j-jdk14-1.6.4.jar set CLASSPATH=%CLASSPATH%;../lib/jacorb.jar set CLASSPATH=%CLASSPATH%;../lib/jacorb-services.jar set SYSTEM_PROPS=-Djacorb.home=.. set SYSTEM_PROPS=%SYSTEM_PROPS% -Dorg.omg.CORBA.ORBClass=org.jacorb.orb.ORB set SYSTEM_PROPS=%SYSTEM_PROPS% -Dorg.omg.CORBA.ORBSingletonClass=org.jacorb.orb.ORBSingleton set SYSTEM_PROPS=%SYSTEM_PROPS% -DOAPort=7980 java %SYSTEM_PROPS% -cp %CLASSPATH% org.jacorb.naming.NameServer


2)分别启动服务端和客户端,需要指定如下的JVM参数:

-Dorg.omg.CORBA.ORBClass=org.jacorb.orb.ORB -Dorg.omg.CORBA.ORBSingletonClass=org.jacorb.orb.ORBSingleton -DORBInitRef.NameService=corbaloc::localhost:7980/NameService


Server代码
1)BookQueryImpl.java

package learning.corba.bookstore.server; import org.omg.CORBA.TCKind; import learning.corba.bookstore.Author; import learning.corba.bookstore.AuthorHelper; import learning.corba.bookstore.Book; import learning.corba.bookstore.BookListHolder; import learning.corba.bookstore.BookQueryPOA; import learning.corba.bookstore.NotFound; import learning.corba.bookstore.SearchCondition; public class BookQueryImpl extends BookQueryPOA { public void search(SearchCondition condition, BookListHolder bookList) throws NotFound { if (condition.name.equals("author") && condition.value.type().kind().value() == TCKind._tk_struct && condition.value.type().equivalent(AuthorHelper.type())) { Author author = AuthorHelper.extract(condition.value); StringBuilder sb = new StringBuilder(128); sb.append("Search Condition:"); sb.append(condition.name); sb.append("="); sb.append(author.firstName); sb.append(" "); sb.append(author.lastName); System.out.println(sb.toString()); } Book[] books = new Book[2]; books[0] = new Book("Thinking in C++", 35.62); books[1] = new Book("Thinking in Java", 59.87); bookList.value = books; } }
2)CallbackServerImpl.javapackage learning.corba.bookstore.server; import learning.corba.bookstore.CallbackServerOperations; import learning.corba.bookstore.ClientCallback; public class CallbackServerImpl implements CallbackServerOperations { public void registerCallback(ClientCallback cc) { clientCallback = cc; } public void callback_notifyMsg(String msg) { clientCallback.notifyMsg(msg); } private ClientCallback clientCallback; }


3)BookStoreServer.java

package learning.corba.bookstore.server; import java.util.Properties; import learning.corba.bookstore.CallbackServerPOATie; import org.omg.BiDirPolicy.BIDIRECTIONAL_POLICY_TYPE; import org.omg.BiDirPolicy.BOTH; import org.omg.BiDirPolicy.BidirectionalPolicyValueHelper; import org.omg.CORBA.Any; import org.omg.CORBA.ORB; import org.omg.CORBA.Policy; import org.omg.CosNaming.NamingContextExt; import org.omg.CosNaming.NamingContextExtHelper; import org.omg.PortableServer.IdAssignmentPolicyValue; import org.omg.PortableServer.ImplicitActivationPolicyValue; import org.omg.PortableServer.LifespanPolicyValue; import org.omg.PortableServer.POA; import org.omg.PortableServer.POAHelper; public class BookStoreServer { public static void main(String[] args) { try { Properties props = new Properties(); props.put("org.omg.PortableInterceptor.ORBInitializerClass.bidir_init", "org.jacorb.orb.giop.BiDirConnectionInitializer"); ORB orb = ORB.init(args, props); POA rootPoa = POAHelper.narrow(orb .resolve_initial_references("RootPOA")); rootPoa.the_POAManager().activate(); BookQueryImpl bookQueryServant = new BookQueryImpl(); NamingContextExt ncRef = NamingContextExtHelper.narrow(orb .resolve_initial_references("NameService")); ncRef.rebind(ncRef.to_name("BookStore.BookQuery"), rootPoa .servant_to_reference(bookQueryServant)); Policy[] policies = new Policy[4]; Any any = orb.create_any(); BidirectionalPolicyValueHelper.insert (any, BOTH.value); policies[0] = rootPoa.create_lifespan_policy (LifespanPolicyValue.TRANSIENT); policies[1] = rootPoa.create_id_assignment_policy (IdAssignmentPolicyValue.SYSTEM_ID); policies[2] = rootPoa.create_implicit_activation_policy (ImplicitActivationPolicyValue.IMPLICIT_ACTIVATION); policies[3] = orb.create_policy (BIDIRECTIONAL_POLICY_TYPE.value, any); POA biPoa = rootPoa.create_POA("BiPOA", rootPoa.the_POAManager(), policies); biPoa.the_POAManager().activate(); CallbackServerImpl callbackServerServant = new CallbackServerImpl(); CallbackServerPOATie callbackServerPOATie = new CallbackServerPOATie(callbackServerServant); ncRef.rebind(ncRef.to_name("BookStore.CallbackServer"), rootPoa.servant_to_reference(callbackServerPOATie)); orb.run(); } catch (Exception e) { e.printStackTrace(); } } }


Client代码
1)ClientCallbackPOA.java

package learning.corba.bookstore.client; import learning.corba.bookstore.ClientCallbackPOA; public class ClientCallbackImpl extends ClientCallbackPOA { public void notifyMsg(String msg) { System.out.println("Callback message from server: " + msg); } }


2)BookStoreClient.java

package learning.corba.bookstore.client; import java.util.Properties; import learning.corba.bookstore.Author; import learning.corba.bookstore.AuthorHelper; import learning.corba.bookstore.Book; import learning.corba.bookstore.BookListHolder; import learning.corba.bookstore.BookQuery; import learning.corba.bookstore.BookQueryHelper; import learning.corba.bookstore.CallbackServer; import learning.corba.bookstore.CallbackServerHelper; import learning.corba.bookstore.ClientCallback; import learning.corba.bookstore.ClientCallbackHelper; import learning.corba.bookstore.SearchCondition; import org.omg.BiDirPolicy.BIDIRECTIONAL_POLICY_TYPE; import org.omg.BiDirPolicy.BOTH; import org.omg.BiDirPolicy.BidirectionalPolicyValueHelper; import org.omg.CORBA.Any; import org.omg.CORBA.ORB; import org.omg.CORBA.Policy; import org.omg.CosNaming.NamingContextExt; import org.omg.CosNaming.NamingContextExtHelper; import org.omg.PortableServer.IdAssignmentPolicyValue; import org.omg.PortableServer.ImplicitActivationPolicyValue; import org.omg.PortableServer.LifespanPolicyValue; import org.omg.PortableServer.POA; import org.omg.PortableServer.POAHelper; public class BookStoreClient { public static void main(String[] args) { try { Properties props = new Properties(); props.put("org.omg.PortableInterceptor.ORBInitializerClass.bidir_init", "org.jacorb.orb.giop.BiDirConnectionInitializer"); ORB orb = ORB.init(args, props); NamingContextExt ncExt = NamingContextExtHelper.narrow( orb.resolve_initial_references("NameService")); BookQuery bookQuery = BookQueryHelper.narrow( ncExt.resolve_str("BookStore.BookQuery")); SearchCondition condition = new SearchCondition(); condition.name = "author"; condition.value = orb.create_any(); AuthorHelper.insert(condition.value, new Author("Bill", "Gates")); BookListHolder bookListHolder = new BookListHolder(); bookQuery.search(condition, bookListHolder); Book[] books = bookListHolder.value; System.out.println("Search Result:"); for (Book book : books) { System.out.println(book.name + " " + book.price); } POA rootPoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); Policy[] policies = new Policy[4]; Any any = orb.create_any(); BidirectionalPolicyValueHelper.insert(any, BOTH.value); policies[0] = rootPoa.create_lifespan_policy(LifespanPolicyValue.TRANSIENT); policies[1] = rootPoa.create_id_assignment_policy( IdAssignmentPolicyValue.SYSTEM_ID); policies[2] = rootPoa.create_implicit_activation_policy( ImplicitActivationPolicyValue.IMPLICIT_ACTIVATION); policies[3] = orb.create_policy (BIDIRECTIONAL_POLICY_TYPE.value, any); POA biPoa = rootPoa.create_POA("BiPOA", rootPoa.the_POAManager(), policies); biPoa.the_POAManager().activate(); ClientCallback cc = ClientCallbackHelper.narrow( biPoa.servant_to_reference(new ClientCallbackImpl())); CallbackServer cs = CallbackServerHelper.narrow( ncExt.resolve_str("BookStore.CallbackServer")); cs.registerCallback(cc); cs.callback_notifyMsg("Hello!"); } catch (Exception e) { e.printStackTrace(); } } }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值