UML软件工程组织

JBuilder7+Delphi6写CORBA体验
王辉■yesky
  前言:

  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编写服务器



版权所有:UML软件工程组织