JacORB2.1 学习笔记--入门篇
JacORB是免费的Java对象请求代理系统(CORBA),附带全部源代码,包含大部分CORBA对象服务的实现,以及大量的代码实例。 下面将介绍如何运行它所带的DEMO,了解基本的JacOrb知识.
(假设您的系统为WIN2K/XP/NT,且已经安装jdk1.4.x 和 ANT工具)
1 下载安装Jacorb2.1 从http://www.jacorb.org/download.html下载JacORB_2_1-compact.zip(已经编译的版本),解压缩到磁盘上,例如C:JacORB_2_1 . 然后, 为了在调试时可以找到有关包和jacorb.properties配置文件,需要在系统环境变量中设置 classpath=.;C:JacORB_2_1idl.jar;C:JacORB_2_1jacorb.jar;C:JacORB_2_1classes; 另外,为了方便使用ant和命令行工具,在path中加入C:JacORB_2_1in 接着,把C:JacORB_2_1etc目录下的jacorb_properties.template复制到C:JacORB_2_1classes目录下,并更名为jacorb.properties 在Corba中命名服务是非常重要的, 编辑jacorb.properties文件,设置其中的 ORBInitRef.NameService=file:/c:/NS_Ref(这里是示例,当然可以为任何httpURL或者其他路径),这个NS_Ref文件会在启动命名服务时生成.该配置文件其余部分保留默认值即可. 2 测试命名服务(NS,Naming Service)是否可以正常启动 在dos窗口下输入 ns c:/NS_Ref 如果出现下面的输出说明已经正常启动 - [configuration loaded from classpath resource file:/C:/JacORB_2_1classesjacorb.properties]
- JacORB V 2.1, www.jacorb.org
- (C) Gerald Brose, XTRADYNE TechnologiesFU Berlin, 16-Feb-2004
- [jacorb.orb.intercept] INFO : InterceptorManager started with 0 SIs, 0 CIs and 1
- IORIs
- [jacorb.naming] INFO : NS up
- [jacorb.orb] INFO : ORB run
如果没有任何输出,可能是由于你的jacorb.properties文件没有放到classpath所在的目录下。 如果没有正确启动NS,运行下面的demo时会出现下面的异常 - [jacorb.orb.intercept] INFO : InterceptorManager started with 0 SIs, 0 CIs and 1 IORIs
- ....
- [jacorb.giop] INFO : ClientConnectionManager: created new conn to target 192.168.4.161:4089
- [jacorb] ERROR : java.net.ConnectException: Connection refused: connect
3 idl编译DEMO下的grid例子 观察 正确启动NS后,DOS窗口转到demo/grid目录下执行ant (如果ant没有安装则不会编译) C:JacORB_2_1demogrid > ant 这样会进行idl编译server.idl文件,在C:JacORB_2_1demogridgenerated下生成corba所需的源文件 同时,ant会编译所有的java源文件, C:JacORB_2_1classes下面生成.class文件 4 运行grid例子,本例实现了一个简单的服务. 4.1 首先参考第2步验证是否ns 已经正常启动. 4.2 启动grid server 在dos窗口中执行 jaco demo.grid.Server 或者 jaco demo.grid.TieServer 正常时输出: - [configuration loaded from classpath resource file:/C:/JacORB_2_1classesjacorb.properties]
- JacORB V 2.1, www.jacorb.org
- (C) Gerald Brose, XTRADYNE TechnologiesFU Berlin, 16-Feb-2004
- [jacorb.orb.intercept] INFO : InterceptorManager
- started with 0 SIs, 0 CIs and 1 IORIs
- [jacorb.poa] INFO : oid:
- 00 11 39 3D 4A 03 47 32 01 07
- B ..9=J.G2...
- object is activated
- [jacorb.giop] INFO : ClientConnectionManager:
- created new conn to target 192.168.4.161:4261
- [jacorb.iiop.conn] INFO : Connected to 192.168.4.161:4261
- from local port 4282
- [jacorb.orb] INFO : ORB run
这时在ns输出窗口可以看到: [jacorb.naming] INFO : Bound name: grid.example 另外,可以通过Jbuilder等IDE工具建立一个工程来运行demo.grid.Server,须指定vm参数-Djava.endorsed.dirs="C:JacORB_2_1lib",结果一致. 4.3 启动grid client端 jaco demo.grid.Client 输出结果: - Height = 31
- Width = 14
- Old value at (30,13): 0.21
- Setting (30,13) to 470.11
- New value at (30,13): 470.11
- MyException, reason: This is only a test exception, no harm done :-)
看到这个结果说明已经成功运行了grid例子.
5 对照源码,下面我们将简单分析Grid例子:
JacORB的应用开发一般分为以下五步: 1.写IDL接口定义 2.编译IDL接口定义生成Java类 3.实现步骤2中生成的接口 4.写服务器启动类,并注册到ORB 5.写客户端去获取服务对象引用
5.1 首先编写server.idl文件 关于编写IDL参考docProgrammingGuide.pdf文档
- // grid.idl
- // IDL defintion of a 2-D grid:
- module demo
- {
- module grid
- {
- interface MyServer
- {
- typedef fixed <5,2> fixedT;
- readonly attribute short height; // height of the grid
- readonly attribute short width; // width of the grid
- void set(in short n, in short m, in fixedT value);
- fixedT get(in short n, in short m);
- exception MyException
- {
- string why;
- };
- short opWithException() raises( MyException );
- };
- };
- };
5.2 利用工具 binidl.bat来编译server.idl idl -d ../.. server.idl 5.3 实现接口 public class gridImpl extends MyServerPOA 填写构造函数,以及接口等方法,如: public gridImpl() public java.math.BigDecimal get(short n, short m) public void set(short n, short m, java.math.BigDecimal value) 5.4 编写服务器 这一步要写一个类来调用gridImpl类,并将其注册到POA,这样远程对象才能通过 MyServer接口来访问它。 1)初始化orb对象。 org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); 2)使用POAHelper来实例化为POA的引用。 org.omg.PortableServer.POA poa = org.omg.PortableServer.POAHelper.narrow(orb.resolve_initial_references("RootPOA")); 3)激活该对象,否则还处于“保持状态,”无法处理任何请求。 poa.the_POAManager().activate(); 4)通过POA将一个Java对象转化成一个CORBA对象。 org.omg.CORBA.Object o = poa.servant_to_reference(new gridImpl()); 5)使nc绑定该对象的引用(这一过程通过命名服务器来完成),注意使对象的名称作为bind()的参数 - NamingContextExt nc = NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));
- nc.bind( nc.to_name("grid.example"), o);
5.5 编写客户端调用服务程序 1) 创建orb对象 org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null); 2) 客户端通过命名服务器获取一个"grid"服务的引用 - NamingContextExt nc = NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));
- grid = MyServerHelper.narrow(nc.resolve(nc.to_name("grid.example")));
3) 使用grid对象进行我们的计算。 《入门篇.完》
|
|