Initializing Corba notification service in java successfully but cannot get any events in linux but it's done in windows

那年仲夏 提交于 2019-12-08 07:37:37

问题


I got a headache about a freaky error when i'm testing my application written in Java. The problem is here: I've written my application used CORBA connection technology. It's an CORBA client application module. In windows environment, the events was pushed successfully but in linux (both redhat and ubuntu) it wasn't. However, it's so freaky that i can call any CORBA functions and get the returned data exactly. I debugged my code, and saw that the initialization of CORBA connection and notification service was successful. In Linux OS, the firewall was disabled and the port 12002 was unused by any applications. It has no any exceptions here. So, could you explain for me what the reason can be here. I have less experience about CORBA. It's so complicated for newbie like me. Help me, please!

P/s: + The initialize code is below:

        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();
  • The method 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;
    
    }
    
  • The connect() method:

     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);
    }
    

    }

  • The disconnect() method:

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

回答1:


I think your object activation is missing. It may be that the ORB behaviour is not fully defined at this poitn, so you'd use more explicit activation here.

// 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);
}



回答2:


Maybe it's not SW related problem but HW/Networking.

If you use multihost computer (more than one network card/interface), then you should specify IP address for receiving CORBA notification.

Take a look into your properties file. I used JacOrb, so file is etc\jacorb.properties and property is following OAAddress=iiop://1.2.3.4:4711



来源:https://stackoverflow.com/questions/9547234/initializing-corba-notification-service-in-java-successfully-but-cannot-get-any

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!