您的位置:首页 > 编程语言 > Java开发

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

2014-06-04 23:42 295 查看
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文件拷贝到eclipse的plugins目录。

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

在eclipse的菜单栏中,选【windows】->[preferences]->[ORB
Studio]->[IDL Compiler],选中JacORB。然后展开[IDL
Compiler],设置JacORB的IDL Command和Command
Options。

默认参数为

IDL Command:java
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
Command:E:\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所提供的方法了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息