JacORB的应用开发一般分为以下五步:
1.写IDL接口定义
接口使用IDL(接口定义语言)在sss.idl中定义
2.编译IDL接口定义生成Java类
使用如下命令编译此接口文件:
$idl -d ../.. server.idl
此命令将生成多个Java源文件,Java源文件的生成依照OMG标准的IDL-Java语言映射定义。
IDL编译器产生Java接口PlanSupplier、PlanSupplierOperations、PlanConsumer、PlanConsumerOperations,及桩和骨架文件_PlanSupplierStub、PlanSupplierPOA、PlanSupplierPOATie、PlanConsumerStub、PlanConsumerPOA、PlanComerPOATie。
注意IDL编译器将会产生一个和IDL接口文件中定义模块相对应的目录结构。如果我们不指定-d ../..,将在当前目录下创建子目录。
3.实现步骤2中生成的接口
现在我们来实现接口定义中描述的功能。这个Java类命名为PlanSupplierServerImpl、PlanConsumerServerImpl,除了要实现接口定义中描述的所有功能外,还应该是在前面生成的类PlanSupplierPOA和PlanConsumerPOA的子类。PlanSupplierPOA和PlanConsumerPOA中包含接受远程调用和将结果返回给客户的端的相关代码。
4.写服务器启动类,并注册到ORB
这一步要写一个类来调用PlanSupplierServerImpl和PlanConsumerServerImpl类,并将其注册到POA,这样远程对象才能通过PlanSupplier和PlanConsumer接口来访问它。
I. 初始化ORB
orb = ORB.init(args, props);
II. 获取一个POA的引用
org.omg.CORBA.Object objPOARoot = orb.resolve_initial_references("RootPOA"); //得到根POA对象
POA poaRoot = POAHelper.narrow(objPOARoot); //得到POA 。ORB可以通过"RootPOA"来获取一个 //初始引用,此引用只是一 个CORBA.Object,需要使用POAHelper来实例化为POA的引用。
III.激活该对象
poaRoot.the_POAManager().activate(); //因为引用刚创建时是“保持”状态,在这种状态下,不能处理任何请求。通过调用POA的 //POAManager对象的activate()方法将POA激活。现在就可以通过POA将一个Java对象转化成一个CORBA对象。
VI. 提供该对象的引用(为了使新创建的CORBA对象能被客户端访问) //这一过程通过目录服务--命名服务器--来完成
org.omg.CORBA.Object objNCE = orb.resolve_initial_references("NameService");
nce = NamingContextExtHelper.narrow(objNCE); //命名服务器的引用实例化为正确的命名服务器对象
V. 发布CORBA对象引用
//绑定servant
Iterator it = servants.keySet().iterator();
while(it.hasNext()){
Servant servant = (Servant)it.next();
String bindingName = (String)servants.get(servant);
org.omg.CORBA.Object obj = poaRoot.servant_to_reference(servant);
//绑定名字对象到Servant的引用
NameComponent[] nct = nce.to_name(bindingName);
nce.rebind(nct, obj);
} //对象的名称作为bind()的参数传入,不能只传递一个字符串,而是应传入代表名称的CosNaming.NameComponents对象
5.写客户端去获取服务对象引用
I. 初始化ORB
orb = ORB.init(args, props);
II. 客户端通过命名服务器获取服务的引用
org.omg.CORBA.Object objNCE = orb.resolve_initial_references("NameService"); //获取命名服务。使用resolve()方法在命
//名服务器上查找"NameService"的引用
nce = NamingContextExtHelper.narrow(objNCE); //返回的结果是org.omg.CORBA.Object对象,需要实例化为 NamingContextExt
在将所有的Java类都成功编译以后,现在可以在不同的Java虚拟机中启动服务器和客户端。当然,应该是命名服务最先启动,如果命名服务还没有启动,使用以下命令来启动:
$ns /home/me/public_html/NS_Ref
/home/me/public_html/NS_Ref是一个本地的可写文件,服务器和客户端都可以通过URL的方式访问。这样,可以不使用端口号,而服务器和客户端都可以获取命名服务的引用,从而实现互相访问。
启动服务器:
$jaco lamost.sss.corbaif.CorbaSrvAgent
接着,运行客户端:
$jaco lamost.sss.corbaif.CorbaClntAgent