目录:
- 概述
- 开发步骤
- 创建Java项目
- 创建IDL文件
- 创建服务单
- 创建客户端
- 测试本地调用
- NamingService命名服务实现远程调用
[一]、概述
本文主要是图文介绍 Eclipse+ORBStudio+JavaIDL(要和OpenORB区别开) 开发CORBA应用的详细步骤,以供初学者借鉴。有关Eclipe中CORBA开发环境的配置详见:
http://www.micmiu.com/opensource/corba/corba-eclipse-env-config/
[二]、开发步骤
打开 Preferences… 点击左侧 ORB Studio → IDL Compiler ,确认右侧默认选中 JavaIDL.
【1】、创建Java项目
在Eclipe中首先创建一个Java Project 取名为:Corba-demo;
【2】、创建IDL文件
在 src 文件夹上右键依次选择 New → Other… → CORBA Wizard → IDL files → Simple IDL
点击 Next 按钮,在File Name:输入Hello4JavaIDL.idl ,点击Finish 完成。
打开Hello4JavaIDL.idl 修改成如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/* * IDL helloworld demo * author by micmiu.com */ module com { module micmiu { module corba { module javaidl { module hello { interface HelloService { string sayHello(in string name); }; }; }; }; }; }; |
选中创建好的Hello4JavaIDL.idl文件,右键 ORB Menu → Compile, 自动编译生成Java 类文件。
【3】、创建服务端
在 src 文件夹上右键依次选择 New → Other… → CORBA Wizard → Server → Active object map
点击Next ,弹出新的对话框,输入如下内容
- IDL filename :选中创建的 Hello4JavaIDL.idl
- Interface :选择IDL文件里定义的接口名 比如 com.micmiu.corba.javaidl.hello.HelloService
- Package :输入包名 比如:com.micmiu.corba.javaidl.server
- Server classesname :服务端类的名称 比如:HelloServiceAOMServerImpl
然后点击 Next,在弹出对话框里选中 Create server class 项(否则不会生成Server_AOM.java),
点击Finish完成服务端类的初步创建。
打开生成的服务端类 HelloServiceAOMServerImpl.java ,添加还未实现的方法,如下
1 2 3 4 5 6 7 |
@Override public String sayHello(String name) { System.out.println("[服务端] 接收的参数 : " + name); String ret = "Hi," + name + " welcome to CORBA"; System.out.println("[服务端] 返回信息 : " + ret); return ret; } |
【4】、创建客户端
在 src 文件夹上右键依次选择 New → Other… → CORBA Wizard → Client → Simple implementation
点击Next ,弹出新的对话框,输入如下信息:
- IDL filename :选中创建的 Hello4JavaIDL.idl
- Interface :选择IDL文件里定义的接口名 比如 com.micmiu.corba.javaidl.hello.HelloService
- Package :输入包名 比如:com.micmiu.corba.javaidl.server
- Client classesname :客户端类的名称 比如: HelloServiceClientImpl
点击 Finish 按钮完成客户端类的初步创建。
打开客户端文件 HelloServiceClientImpl.java ,修改其main方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public static void main(String[] args) { try { HelloServiceClientImpl test = new HelloServiceClientImpl(args); // test.getORBInterface().operation1("A message in the bottle..."); String ret = test.getORBInterface().sayHello("micmiu.com"); System.out.println("[客户端] 调用结果 : " + ret); test.shutdown(); } catch(Exception ex) { ex.printStackTrace(); } } |
【5】、测试本地调用
首先运行服务端:Server_AOM.java 然后再运行客户端类:HelloServiceClientImpl.java
服务端日志如下:
CORBA Server ready…
[服务端] 接收的参数 : micmiu.com
[服务端] 返回信息 : Hi,micmiu.com welcome to CORBA
客户端日志如下:
[客户端] 调用结果 : Hi,micmiu.com welcome to CORBA
【6】.NamingService 命名服务实现远程调用
第一步: 服务端Server_AOM.java代码修改
注释调以下代码:
1 2 3 |
//PrintWriter ps = new PrintWriter(new FileOutputStream(new File("server.ior"))); //ps.println(orb.object_to_string(obj)); //ps.close(); |
取消以下代码注释:
1 2 3 |
org.omg.CORBA.Object ncobj =orb.resolve_initial_references("NameService"); NamingContextExt nc =NamingContextExtHelper.narrow(ncobj); nc.bind(nc.to_name("MyServerObject"), obj); |
导入相关类的引用。
修改后完整代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
package com.micmiu.corba.javaidl.server; import java.util.Properties; import org.omg.CosNaming.NamingContextExt; import org.omg.CosNaming.NamingContextExtHelper; import org.omg.PortableServer.IdAssignmentPolicyValue; import org.omg.PortableServer.POA; import org.omg.PortableServer.POAHelper; import org.omg.PortableServer.ThreadPolicyValue; // import org.omg.PortableServer.LifespanPolicyValue; public class Server_AOM { public static void main(String[] args) { Properties props = System.getProperties(); props.setProperty("org.omg.CORBA.ORBClass", "com.sun.corba.se.internal.POA.POAORB"); props.setProperty("org.omg.CORBA.ORBSingletonClass", "com.sun.corba.se.internal.corba.ORBSingleton"); try { // Initialize the ORB. org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, props); // get a reference to the root POA org.omg.CORBA.Object obj = orb.resolve_initial_references("RootPOA"); POA poaRoot = POAHelper.narrow(obj); // Create policies for our persistent POA org.omg.CORBA.Policy[] policies = { // poaRoot.create_lifespan_policy(LifespanPolicyValue.PERSISTENT), poaRoot.create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID), poaRoot.create_thread_policy(ThreadPolicyValue.ORB_CTRL_MODEL) }; // Create myPOA with the right policies POA poa = poaRoot.create_POA("HelloServiceAOMServerImpl_poa", poaRoot.the_POAManager(), policies); // Create the servant HelloServiceAOMServerImpl servant = new HelloServiceAOMServerImpl(); // Activate the servant with the ID on myPOA byte[] objectId = "AnyObjectID".getBytes(); poa.activate_object_with_id(objectId, servant); // Activate the POA manager poaRoot.the_POAManager().activate(); // Get a reference to the servant and write it down. obj = poa.servant_to_reference(servant); // ---- Uncomment below to enable Naming Service access. ---- org.omg.CORBA.Object ncobj = orb.resolve_initial_references("NameService"); NamingContextExt nc = NamingContextExtHelper.narrow(ncobj); nc.bind(nc.to_name("MyServerObject"), obj); //PrintWriter ps = new PrintWriter(new FileOutputStream(new File("server.ior"))); //ps.println(orb.object_to_string(obj)); //ps.close(); System.out.println("CORBA Server ready..."); // Wait for incoming requests orb.run(); } catch(Exception ex) { ex.printStackTrace(); } } } |
第二步:客户端 HelloServiceClientImpl.java 代码的修改
在main 方法中注释调如下代码:
1 2 3 |
//LineNumberReader input = new LineNumberReader(new FileReader("server.ior")); //String ior = input.readLine(); //org.omg.CORBA.Object obj = orb.string_to_object(ior); |
取消下面代码的注释:
1 2 3 |
org.omg.CORBA.Object ncobj = orb.resolve_initial_references("NameService"); NamingContextExt nc = NamingContextExtHelper.narrow(ncobj); org.omg.CORBA.Object obj = nc.resolve_str("MyServerObject"); |
修改其main 方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public static void main(String[] args) { try { HelloServiceClientImpl test = new HelloServiceClientImpl(args); // test.getORBInterface().operation1("A message in the bottle..."); String ret = test.getORBInterface().sayHello("micmiu.com"); System.out.println("[客户端] 调用结果 : " + ret); test.shutdown(); } catch(Exception ex) { ex.printStackTrace(); } } |
ps: new HelloServiceClientImpl(args) 需要配置参数实例化
第三步:测试命名服务实现远程调用
先启动命名服务的监听,以端口 1234 为例:
1 |
orbd -ORBInitialPort 1234 -ORBInitialHost 127.0.0.1 |
ps :orbd 是jdk自带的命令
然后启动服务端:Server_AOM.java 需要配置参数:
-ORBInitialHost 127.0.0.1 -ORBInitialPort 1234
最后启动客户端:HelloServiceClientImpl.java 同样需要配置参数
-ORBInitialHost 127.0.0.1 -ORBInitialPort 1234
运行结果和上面本地调用测试的结果一样。
本文介绍到此结束@Michael Sun.
原创文章,转载请注明: 转载自micmiu – 软件开发+生活点滴[ http://www.micmiu.com/ ]
本文链接地址: http://www.micmiu.com/opensource/corba/corba-javaidl-dev-demo/
创建IDL文件
在 src 文件夹上右键依次选择 New → Other… → CORBA Wizard → IDL files → Simple IDL
我在这一步就中断了,配置了OpenORB,但是好像没有效果 😥 😥 😥
😐 😐 😐 😐 😐