在java中成功初始化Corba通知服务,但无法在linux中获取任何事件,但它在Windows中完成

当我测试用Java编写的应用程序时,我对一个奇怪的错误感到头疼。 问题在于:我编写的应用程序使用了CORBA连接技术。 它是一个CORBA客户端应用程序模块。 在Windows环境中,事件被成功推送但在linux(redhat和ubuntu)中却没有。 但是,它非常怪异,我可以调用任何CORBA函数并准确地获取返回的数据。 我调试了我的代码,看到CORBA连接和通知服务的初始化成功了。 在Linux OS中,防火墙被禁用,端口12002未被任何应用程序使用。 这里没有任何例外。 那么,你能解释一下原因是什么吗? 我对CORBA的经验不足。 像我这样的新手这么复杂。 请帮帮我!

P / s:+初始化代码如下:

Properties props = new Properties(); /*props.setProperty("borland.enterprise.licenseDefaultDir", "C:/Borland/VisiBroker/license");*/ props.setProperty("org.omg.CORBA.ORBClass", "com.inprise.vbroker.orb.ORB"); props.setProperty("org.omg.CORBA.ORBSingletonClass", "com.inprise.vbroker.orb.ORBSingleton"); props.setProperty("javax.rmi.CORBA.StubClass", "com.inprise.vbroker.rmi.CORBA.StubImpl"); props.setProperty("javax.rmi.CORBA.UtilClass", "com.inprise.vbroker.rmi.CORBA.UtilImpl"); props.setProperty("javax.rmi.CORBA.PortableRemoteObjectClass", "com.inprise.vbroker.rmi.CORBA.PortableRemoteObjectImpl"); props.setProperty("vbroker.agent.enableLocator", "false"); props.setProperty("vbroker.orb.initRef", "NotificationService=corbaloc::xxxx:12002/NotificationService"); try { System.out.println("orb = org.omg.CORBA.ORB.init(new String[0], props);"); orb = org.omg.CORBA.ORB.init(new String[0], props); } catch (Exception e) { System.out.println("Fail initial orb for Noti-Service.."+e); System.exit(1); } try { org.omg.CORBA.Object poa = orb.resolve_initial_references("RootPOA"); rootPoa = POAHelper.narrow(poa); } catch (org.omg.CORBA.ORBPackage.InvalidName e) { System.out.println("Can't get RootPOA"+ e); System.exit(1); } try { rootPoa.the_POAManager().activate(); System.out.println("rootPoa.the_POAManager().activate();"); } catch (org.omg.PortableServer.POAManagerPackage.AdapterInactive ex) { System.out.println("Can't activate POAManager"+ex); System.exit(1); } Runtime.getRuntime().addShutdownHook(new Thread(new ShutdownHook(orb))); Thread thread = new Thread() { public void run() { orb.run(); } }; thread.setName("OpenFusion ORB thread"); thread.start(); 
  • 方法getObject():

    private StructuredPushConsumer getObject(){StructuredPushConsumer serverObj = null;

      org.omg.PortableServer.Servant servant = new StructuredPushConsumerPOATie(this, rootPoa); try { org.omg.CORBA.Object ref = rootPoa.servant_to_reference(servant); serverObj = StructuredPushConsumerHelper.narrow(ref); } catch (ServantNotActive e) { System.out.println("Unexpected Exception: "+e); System.exit(1); } catch (WrongPolicy e) { System.out.println("Unexpected Exception: "+e); System.exit(1); } return serverObj; } 
  • connect()方法:

      public void connect() { /* Defines the type of proxy required */ ClientType ctype = ClientType.STRUCTURED_EVENT; /* Holder to hold the proxy id */ org.omg.CORBA.IntHolder pid = new org.omg.CORBA.IntHolder(); /* Proxy supplier variable */ ProxySupplier proxySupplier = null; /* Obtain the consumer admin object reference */ ConsumerAdmin admin = channel.default_consumer_admin(); try { /* obtain a structured push supplier object reference. */ proxySupplier = ((ConsumerAdminOperations) admin).obtain_notification_push_supplier(ctype, pid); System.out.println("proxySupplier = ((ConsumerAdminOperations) admin).obtain_notification_push_supplier(ctype, pid);"); } catch (AdminLimitExceeded ex) { /* * Thrown if the admin object is unable to have any more proxy suppliers associated with it. */ System.err.println("Maximum number of proxies exceeded!"); System.exit(1); } /* Narrow the proxy supplier to a Structured Proxy Push Supplier */ proxy = StructuredProxyPushSupplierHelper.narrow(proxySupplier); try { /* connect the consumer to the proxy */ proxy.connect_structured_push_consumer(getObject()); System.out.println("proxy.connect_structured_push_consumer(getObject());"); } catch (AlreadyConnected e) { /* * This exception is thrown if a consumer is already connected to this proxy. This should not be thrown because the proxy has just been created. */ System.err.println("Already connected!"); System.exit(1); } catch (TypeError e) { /* * This exception is thrown if you attempt to connect a sequenced consumer to a structured proxy or vice versa. */ System.err.println("Type error!"); System.exit(1); } 

    }

  • disconnect()方法:

     public void disconnect() { if (proxy != null) { System.out.println("Disconnected!"); } } 

我认为你的对象激活缺失了。 可能是在这个poitn中没有完全定义ORB行为,所以你在这里使用更明确的激活。

 // create TIE StructuredPushConsumerPOATie pushConsumer = new StructuredPushConsumerPOATie(this, rootPoa); // activate object (may work without that) rootPoa.activate_object(pushConsumer); try { // implicit activation org.omg.CORBA.Object ref = pushConsumer._this_object(); serverObj = StructuredPushConsumerHelper.narrow(ref); } 

也许这不是SW相关的问题,而是硬件/网络。

如果您使用多主机(多个网卡/接口),则应指定接收CORBA通知的IP地址。

查看您的属性文件。 我使用了JacOrb,所以文件是etc \ jacorb.properties ,属性跟随OAAddress = iiop://1.2.3.4:4711