Eclipse下JacORB开发环境搭建及实例

JacORB是OMG  corba的Java实现,用于开发分布式应用。本文将详细介绍如何在Eclipse下搭建JacORB开发环境。


一、安装JacORB

首先下载Jacorb发行包,到JacORB官网下载jacORB发行版本,建议选择编译好的(源码版需要使用ant编译),本文作者选择的是 jacorb-3.4-binary.zip。

接着把jacorb添加到系统环境变量,解压文件包到某一路径,比如 E:\JacORB\jacorb-3.4, 然后将E:\JacORB\jacorb-3.4\bin添加到path环境变量

接下来配置jacorb名字服务,将E:\JacORB\jacorb-3.4\etc路径下jacorb_properties.template文件更名为jacorb.properties,然后用文本编辑器打开找到ORBInitRef.NameService=file:/c:/NS_Ref ,去掉其前面的注释符并把其它的选择注释掉。这一步是设置ior文件存放路径,里面有服务的ip地址及端口信息等,用dior –f c:/NS_Ref命令可以解析这个ior文件以得到ip地址及端口号。 

至此,jacorb安装完毕,打开命令行窗口,输入ns,即可启动名字服务NameService

NameService的启动参数如下:

ns [-Djacorb.naming.ior filename=<filename>] [-DOAPort=port] [-Djacorb.naming.time out=<timeout>]

一般会指定端口,即第二个参数

注意:如果NameService所在机器有多个IP地址,即多宿主机器,那么在没有指定所用IP地址的情况下,系统会自行选择,这时可以通过dior –f c:/NS_Ref来查看NameService所用IP地址。


二、安装Eclipse的JacORB开发插件

首先在下JacORB的Eclipse插件ORBStudio_7.7.7.jar并安装。

安装Eclipse的方法有多种,这里采用最简单的方式,将ORBStudio_7.7.7.jar文件拷贝到eclipseplugins目录。

接下来就是配置ORBStudio_7.7.7插件,配置内容如下:

eclipse的菜单栏中,选【windows->[preferences]->[ORB Studio]->[IDL Compiler],选中JacORB然后展开[IDL Compiler],设置JacORBIDL CommandCommand Options

默认参数为

IDL Commandjava
Command Options
-cp "/Tools/JacORB/lib/idl.jar;/Tools/JacORB/lib/logkit-1.2.jar" org.jacorb.idl.parser -d %D% %F%

这里有两中配置是,

第一种是在默认参数的基础上将Command Options的内容改为正确的路径即可

Command Options-cp "E:/JacORB/jacorb-3.4/lib/idl.jar;E:/JacORB/jacorb-3.4/lib/logkit-1.2.jar" org.jacorb.idl.parser -d %D% %F%

第二种如下

IDL CommandE:\JacORB\jacorb-3.4\bin\idl.bat

Command Options:-d %D% %F%

保存即配置完毕


三、Eclipse下Jacorb开发步骤

1)新建Java项目

2)在项目上右键New--->Other--->CORBA Wizard--->IDL files--->Simple IDL,建立一个IDL文件,如demo.idl

3)编译IDL文件,右键点击demo.idl文件,选[ORB Menu]->[Compile],会生成demo.hello包,里面包含7个自动生成的文件

4)编写服务端,在项目上右键New--->Other--->CORBA Wizard--->Server--->Active object map,然后数据Package名即可(Package名和Server Class名都可以自定义)

这里也可以手动创建服务端

5)编写客户端,在项目上右键New--->Other--->CORBA Wizard--->Client--->....。当然也可以手动创建


四、服务端和客户端关键代码

1)服务端

服务端主要包括一个对之前在IDL文件中定义的借口的实现类(XXXServiceImpl.java),和一个Server类

XXXServiceImpl.java的实现与本地编程无异。

Server类用于关联XXXServiceImpl.java和JacORB提供的机制,具体的实现又有两种,一种是使用NameService,另一种是采用IOR文件来传递Object信息。这里介绍前者,后者没有技术难度。(后者即使在服务端将服务对象的信息输出到文件,客户端读取这个文件,从中获得服务对象的信息,从而实访问)

//首先,初始化ORB,注意参数192.168.1.101::8893分别是NameService的IP地址和端口

Properties props = System.getProperties();
//props.setProperty("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
//props.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
props.put("org.omg.CORBA.ORBInitRef.NameService", "corbaloc::192.168.1.101::8893/NameService");
orb = org.omg.CORBA.ORB.init((String[])args, props);

//下面这种参数连接到的是Java(Sun)所提供的orbd名字服务器,不是JacORB所提供的NameService,注意

//props.put("org.omg.CORBA.ORBInitialHost", "192.168.1.101");  
//props.put("org.omg.CORBA.ORBInitialPort", "8893");


//接下来初始化POA
        POA poa =
            POAHelper.narrow( orb.resolve_initial_references( "RootPOA" ));
        poa.the_POAManager().activate();

        // 创建服务对象
        GoodDayServerImpl goodDayImpl = new GoodDayServerImpl( );
        // 创建服务对象的Corba引用
        org.omg.CORBA.Object objGoodDay = poa.servant_to_reference(goodDayImpl);
        GoodDay gref = GoodDayHelper.narrow(objGoodDay);
        
        // 获得NameService的Context
        org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
        NamingContextExt nc = NamingContextExtHelper.narrow(objRef);
//服务对象的名称
        String goodDayName = "GoodDayService";

//将服务对象引用和服务对象名称进行绑定
        NameComponent path[] = nc.to_name(goodDayName);
        nc.rebind(path, gref);

//启动服务

          orb.run();    


2)客户端关键代码

// 创建和初始化ORB,同样192.168.1.101::8893分别为NameService的IP地址和端口
Properties props = new Properties();
//props.setProperty("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
//props.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
props.put("org.omg.CORBA.ORBInitRef.NameService", "corbaloc::192.168.1.101::8893/NameService");
ORB orb = ORB.init(args, props);
// 获得代表命名服务的Context
org.omg.CORBA.Object objRef = orb
.resolve_initial_references("NameService");
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);


// 获得名为"GoodDayService"的GoodDay对象的远程引用
String targetName = "GoodDayService";
remoteTarget = GoodDayHelper.narrow(ncRef
.resolve_str(targetName));

接下来就可以通过remoteTarget引用像在本地一样使用GoodDay所提供的方法了




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值