Chinaunix首页 | 论坛 | 博客
  • 博客访问: 54130
  • 博文数量: 5
  • 博客积分: 2127
  • 博客等级: 上尉
  • 技术积分: 135
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-19 21:20
文章分类

全部博文(5)

文章存档

2011年(5)

分类: Java

2011-06-22 22:40:46

    做CORBA程序,经常被要求实现持久化的(Persistent)IOR。那什么是持久化的IOR呢?我们知道IOR是CORBA对象的可互操作(跨平台,跨语言)的标识方式。简单地说,其中记录了所有CORBA Server的访问信息。通常访问信息包括:
  1. 网络协议,通常是 IIOP
  2. 网络地址,包括 IP 地址和端口 (在IIOP的情况下)
  3. POA 的 id
  4. CORBA Object 的 id
这些信息大都由程序在启动时按照一定的规则自动分配。因此同一个Server端程序在多次启动时会生成不同的访问点。那么Client程序用于访问Server的IOR将在Server重新启动后失效。为了解决这个问题,就需要持久化IOR。有一点要特别注意,持久化IOR不是说每次启动Server都会生成完全相同的IOR,只是保证用原来的IOR一定可以访问重启后的Server。原因在于IOR中可能有冗余的没有初始化的数据字段,这些字段可能在每次启动时都不同,也可能相同,依赖于具体ORB的实现,它们的内容无关紧要。有时测试人员会设计测试用例检查多次生成的IOR是否完全相等,这是没有依据的,虽然多数时候能奏效。
    持久化IOR实际上就是要固定以上列出的所有访问信息,在Java 的 Jacorb 方法有很多,以下代码是其中一种完全使用代码的实现,其他的实现可以通过配置或是命令行参数。
  1.      Properties props = new Properties();
  2.      props.put("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
  3.      props.put("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
  4.      props.put("OAAddress", "iiop://localhost:10025"); //Fixed IP & Port
  5.      props.put("jacorb.implname","myPersistentPOA" ); //Fixed POA Id
  6.      ORB orb = ORB.init( args, props );
  7.         
  8.      //init POA
  9.      POA poaRoot = POAHelper.narrow( orb.resolve_initial_references( "RootPOA" ));

  10.      // Create policies for our persistent POA
  11.      org.omg.CORBA.Policy[] policies = {
  12.          poaRoot.create_lifespan_policy(LifespanPolicyValue.PERSISTENT),
  13.          poaRoot.create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID),
  14.          poaRoot.create_thread_policy(ThreadPolicyValue.ORB_CTRL_MODEL)
  15.      };

  16.      // Create myPOA with the right policies
  17.      POA poa = poaRoot.create_POA("myPersistentPOA", poaRoot.the_POAManager(), policies);
  18.      poa.the_POAManager().activate();
  19.      
  20.      // create a Servant object
  21.      XXXXXImpl impl = new XXXXXImpl( );
  22.     
  23.      // create the object reference
  24.      byte[] objectId = "AnyObjectID".getBytes(); // Fixed Object Id
  25.      poa.activate_object_with_id(objectId, impl );
  26.      org.omg.CORBA.Object obj = poa.servant_to_reference( impl );
  27.      String ior = orb.object_to_string( obj )
  28.      // Publish IOR here
  29.      // ......

  30.      orb.run()
    请注意那个 localhost 地址只能被本机访问。若要远程访问请使用 public 的 IP 地址。另外如果使用 cluster 的 浮动(Virtual)IP,就可以在 cluster (集群)的环境中使用,并且获得集群提供的 HA (High availability, 高可用性)能力。
    我们可以看到Jacorb本身就可以直接简单地支持持久化IOR,不必借助于更加复杂的机制,如IMR服务什么的。
阅读(2546) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~