做CORBA程序,经常被要求实现持久化的(Persistent)IOR。那什么是持久化的IOR呢?我们知道IOR是CORBA对象的可互操作(跨平台,跨语言)的标识方式。简单地说,其中记录了所有CORBA Server的访问信息。通常访问信息包括:
- 网络协议,通常是 IIOP
- 网络地址,包括 IP 地址和端口 (在IIOP的情况下)
- POA 的 id
- CORBA Object 的 id
这些信息大都由程序在启动时按照一定的规则自动分配。因此同一个Server端程序在多次启动时会生成不同的访问点。那么Client程序用于访问Server的IOR将在Server重新启动后失效。为了解决这个问题,就需要持久化IOR。有一点要特别注意,持久化IOR不是说每次启动Server都会生成完全相同的IOR,只是保证用原来的IOR一定可以访问重启后的Server。原因在于IOR中可能有冗余的没有初始化的数据字段,这些字段可能在每次启动时都不同,也可能相同,依赖于具体ORB的实现,它们的内容无关紧要。有时测试人员会设计测试用例检查多次生成的IOR是否完全相等,这是没有依据的,虽然多数时候能奏效。
持久化IOR实际上就是要固定以上列出的所有访问信息,在Java 的 Jacorb 方法有很多,以下代码是其中一种完全使用代码的实现,其他的实现可以通过配置或是命令行参数。
- Properties props = new Properties();
-
props.put("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
-
props.put("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
-
props.put("OAAddress", "iiop://localhost:10025"); //Fixed IP & Port
-
props.put("jacorb.implname","myPersistentPOA" ); //Fixed POA Id
-
ORB orb = ORB.init( args, props );
-
-
//init POA
-
POA poaRoot = POAHelper.narrow( orb.resolve_initial_references( "RootPOA" ));
-
-
// Create policies for our persistent POA
-
org.omg.CORBA.Policy[] policies = {
-
poaRoot.create_lifespan_policy(LifespanPolicyValue.PERSISTENT),
-
poaRoot.create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID),
-
poaRoot.create_thread_policy(ThreadPolicyValue.ORB_CTRL_MODEL)
-
};
-
-
// Create myPOA with the right policies
-
POA poa = poaRoot.create_POA("myPersistentPOA", poaRoot.the_POAManager(), policies);
-
poa.the_POAManager().activate();
-
-
// create a Servant object
-
XXXXXImpl impl = new XXXXXImpl( );
-
-
// create the object reference
-
byte[] objectId = "AnyObjectID".getBytes(); // Fixed Object Id
-
poa.activate_object_with_id(objectId, impl );
-
org.omg.CORBA.Object obj = poa.servant_to_reference( impl );
-
String ior = orb.object_to_string( obj )
-
// Publish IOR here
-
// ......
-
-
orb.run()
请注意那个 localhost 地址只能被本机访问。若要远程访问请使用 public 的 IP 地址。另外如果使用 cluster 的 浮动(Virtual)IP,就可以在 cluster (集群)的环境中使用,并且获得集群提供的 HA (High availability, 高可用性)能力。
我们可以看到Jacorb本身就可以直接简单地支持持久化IOR,不必借助于更加复杂的机制,如IMR服务什么的。
阅读(2603) | 评论(0) | 转发(0) |