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

Posted

技术标签:

【中文标题】在java中成功初始化Corba通知服务但在linux中无法获取任何事件但在windows中完成【英文标题】:Initializing Corba notification service in java successfully but cannot get any events in linux but it's done in windows 【发布时间】:2012-03-03 15:22:52 【问题描述】:

我在测试用 Java 编写的应用程序时遇到了一个奇怪的错误。问题就在这里:我编写的应用程序使用了 CORBA 连接技术。它是一个 CORBA 客户端应用程序模块。在 Windows 环境中,事件被成功推送,但在 linux(redhat 和 ubuntu)中却没有。但是,它太怪异了,我可以调用任何 CORBA 函数并准确地获取返回的数据。我调试了我的代码,看到CORBA连接和通知服务的初始化是成功的。在 Linux 操作系统中,防火墙被禁用,任何应用程序都未使用端口 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::x.x.x.x: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()方法:

私有 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!");
    

【问题讨论】:

您能否提供有关您的应用程序部署的更多详细信息?你的问题到底是什么?网络连接? 当我在 Windows 中开发我的 Java 桌面应用程序时,它可以从 Corba 服务器获取任何结构化事件。但是当我运行我的代码并在 linux 中调试(使用 eclipse)时,它没有从 Corba 服务器模块获得任何推送事件。通知服务正在侦听端口 12002,并且防火墙已禁用。 你没有得到任何错误? 是的,完全正确。这太离谱了。 :( 服务器和客户端都在同一台主机上运行? 【参考方案1】:

我认为您的对象激活丢失了。可能是此时 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);

【讨论】:

我试试你的方法,它和我上面的 getObject() 方法没有太大区别。最后,它仍然不会将任何事件推送到事件通道。我使用 WireShark 捕获通知服务器的 IP 数据包并通知客户端以太网卡。在 Windows 主机中,我捕获了事件数据包,但在 linux 中,没有。所以问题还是在这里。您还有其他解决方案吗? 顺便说一句。这就是推消费者!不是活动制作人! 是的,完全正确。我认为问题在于事件提供者没有将任何事件推送到事件通道,因此推送消费者无法捕获任何事件。我的代码仍然是正确的。【参考方案2】:

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

如果您使用多主机计算机(多于一个网卡/接口),那么您应该指定接收 CORBA 通知的 IP 地址。

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

【讨论】:

以上是关于在java中成功初始化Corba通知服务但在linux中无法获取任何事件但在windows中完成的主要内容,如果未能解决你的问题,请参考以下文章

基于CORBA的可靠消息传递技术

CORBA 错误:方法中的 ORB 初始化

在 Java 中运行嵌入式 CORBA 命名服务

在 Java 中使用 Eclipse 为 CORBA IDL 启动命名服务

Corba 客户端 - Python 和 Corba 服务器 - Java

Corba python 与 web 服务 java 的集成