前言:
CORBA是一种透时的分布对象标准,也是一种语言中立的对象标准,这里讲一些使用JBuilder 7和DELPHI 6混合编写CORBA程序个人体验。
测试用软件环境: JBuilder 7 vbroker for JAVA 4.5 DELPHI 6(安装时选取安装VisiBroker 4.0)
运行限制:
DELPHI编写的CORBA软件运行时需求要以下DLL,
orbpas40.dll (在Delphi6\Bin目录内) cc3250mt.dll (在Delphi6\Bin目录内) orb_br.dll (vbroker for c++的bin目录内) vport_br.dll (vbroker for c++的bin目录内)
所以在运行DELPHI编写的CORBA软件时,要保证通过环境变量PATH可以找到以上4个DLL文件。
实际使用时可以只使用了vbroker for JAVA的各种服务程序,不使用vbroker for c++的服务程序,各种服务器运行于本网段其他主机(含非同类型主机,如在服务器运行于linux主机)也可以正常运行CORBA程序。
局限性:
Visibroker 3.x 和4.x支持,BOA方式, POA在Visibroker 4.X上支持,但现在DELPHI CORBA编程只支持BOA方式。 JBuilder 和C++Builder 支持POA方式编程
如果在DELPHI编程中需要使用POA方式可以到 http://www.millennium-group.ru/tools 去下载MT DORB 这个工具包提供了DELPHI POA的支持
编程中的个人心得:
1、JBuilder 可以通过向导生成CORBA的JSP客户端程序,但向导是按POA方式生成,所以对于JAVA连接DELPHIE编写的CORBA服务器自动生成的JSP和 clientImpl1代码要进行必要的修改。
例:
原码为:
ifaceAccount = aaa.AccountHelper.bind(_orb, "/" + name + "_poa", name.getBytes());
更换为
ifaceAccount= aaa.AccountHelper.bind(_orb);
或
ifaceAccount = aaa.AccountHelper.bind(orb,"Jack B Quick2");
其中:“Jack B Quick2”为运行osfind 中的OBJECT NAME,下面是运行osfind时出现的部分内容:
REPOSITORY ID: IDL:aaa/Account:1.0 OBJECT NAME: Jack B Quick2
2、DELPHI调用JAVA编写的CORBA服务,如果对方是使用POA方式,那么只能用IOR字串完成。 参考代码如下:
//javas(AnsiString类型)是从文件读入的IOR串,IOR串是服务启动产生时写入的 //orj 是CORBAObject类 obj:=orb.StringToObject(javas); act:=TAccountHelper.Narrow(obj,true);
3、BCB可以支持POA,当前DELPHI不支持,为了兼容DELPHI,并使用JB7的向导能力,可以改写JB7的自动生成BOA的服务。
首先:
JB7的生成 Bulid IDL的属性(Additional options)加 -boa,对于已经生成的服务:如
public class AccountManagerImpl extends AccountManagerPOA {
改成
public class AccountManagerImpl extends _AccountManagerBase {
初始函数要有以下支持(这点同POA很不同)
public AccountManagerImpl(java.lang.String name) { super(name); }
服务程序如下
// Server.java public class Server { public static void main(String[] args) { // Initialize the ORB. org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null); // Initialize the BOA. com.inprise.vbroker.CORBA.BOA boa = ((com.inprise.vbroker.CORBA.ORB)orb).BOA_init(); // Create the account manager object. Bank.AccountManager manager = new AccountManagerImpl("BankManager"); // Export the newly created object. boa.obj_is_ready(manager); System.out.println(manager + " is ready."); // Wait for incoming requests boa.impl_is_ready(); } }
3、JB7在设定 VisiBroker时,进行相应的参数设定,具体是在%java_home%\jre\lib\orb.properties 文件内指定了 org.omg.CORBA.ORBClass=com.inprise.vbroker.orb.ORB org.omg.CORBA.ORBSingletonClass=com.inprise.vbroker.orb.ORB
使JDK在运行时,使用了com.inprise.vbroker.orb.ORB类,如果要这个的设定,可以手工修改或删除 orb.properties 文件。
4、使用Inprise\vbroker_java\bin\nameserv.exe 服务
1) IDL文件要通过Inprise的IDL2JAVA -boa 方式make(原来的对于JDK的旧程序从新make,SUN同Inprise有些不兼容)
2) 在原程序
ORB orb = ORB.init(args,System.getProperties());
前要先设定
System.getProperties().put("org.omg.CORBA.ORBClass", "com.inprise.vbroker.orb.ORB"); System.getProperties().put("org.omg.CORBA.ORBSingletonClass", "com.inprise.vbroker.orb.ORB"); System.getProperties().put("SVCnameroot", "NameService");
或(具体看下面相关说明)
System.getProperties().put("ORBInitRef", "NameService=iioploc://localhost:23000/NameService");
3)nameserv通过. start nameserv 方式启动使用System.getProperties().put("SVCnameroot", "NameService");
nameserv通过 start nameserv -J-Dvbroker.se.iiop_tp.scm.iiop_tp.listener.port=23000 方式启动,使用System.getProperties().put("ORBInitRef", "NameService=iioploc://localhost:23000/NameService");
4)更具体可参考系统VisiBroker自带的例子
5、运动JAVA程序,推荐使用vbj,当然也可用java启动,那么CLASSPATH就要小心设定,不要少了什么类。
小结:
1如果用JBuilder 7和DELPHI 6混合编写CORBA程序,推荐使用JAVA编写BOA方式的CORBA服务
1)BOA方式比POA要方便很多,当然也因DELPHI不支持POA
2)JAVA编写的服务可以跨平台运行
3)可以使用JBuilder 7的向导(模版)功能
2使用DELPHI和JAVA编写客户端支持良好,编程方式基本相同
3发现的不明问题oadutil注册DELPHI编写的CORBAE服务程序(测试过自行编写的及DELPH6自带的例子),客户端第二次调用和关闭服务器出现内存错。所以最好是用JAVA编写服务器
|