org.omg.CORBA.MARSHAL: Server-side Exception: null

谁说我不能喝 提交于 2019-12-24 18:06:12

问题


I'm trying to register to a CORBA CosNotification Service. In the documentation of the service I'm trying to connect to, it says I have to a CosNotifyComm::SequencePushConsumer object, and attach it to the notification service. I've included my code, and the error I'm getting back.

AlarmClient.java

import NotificationIRPSystem.*;
import org.omg.CosNotification.*;
import org.omg.CosNotifyComm.*;
import org.omg.CosNotifyChannelAdmin.*;
import org.omg.CosNotifyFilter.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.PortableServer.*;


public class AlarmClient
{
  static _NotificationIRPOperations notiOp;
  public static void main (String args [])
  {
    try{
      org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init (args, null);
      org.omg.CORBA.Object objRef =
        orb.resolve_initial_references ("NameService");
      System.out.println("IOR===> " + objRef);
      NamingContextExt nc = NamingContextExtHelper.narrow(objRef);
      String name = "com/ericsson/nms/cif/service/NMSNAConsumer";
      String portal = "com/ericsson/nms/cif/service/NMSNAPortal";
      org.omg.CORBA.Object notiObj = nc.resolve_str(name);
      System.out.println(nc.resolve_str(portal));
      System.out.println("noti---->" + notiObj);
      _NotificationIRPOperations tt = _NotificationIRPOperationsHelper.narrow(notiObj);

      IRPManager irpMan = new IRPManager();
      POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
      poa.the_POAManager().activate();
      org.omg.CORBA.Object objNotiServer = poa.servant_to_reference(irpMan);

      String manager_reference = orb.object_to_string(objNotiServer);
      System.out.println("MANAGER REF: " + manager_reference);
      System.out.println("OBJ NOTI SERVER: " + objNotiServer);
      int time_tick = 15;
      String filter = "";
      String[] asd = {};
      NotificationIRPConstDefs.EventTypesSetHolder e_list = new NotificationIRPConstDefs.EventTypesSetHolder();
      NotificationIRPConstDefs.ExtendedEventTypesSetHolder ex_list = new NotificationIRPConstDefs.ExtendedEventTypesSet\
Holder();
      String cats[] = tt.get_notification_categories(e_list, ex_list);
            String res = tt.attach_push(manager_reference, time_tick, asd , filter);
      //      System.out.println("SUCCESS--->" + res);
      //                  String[] ids = tt.get_subscription_ids(manager_reference);
      System.out.println("ALARMIRPOPERATIONS_----> " + tt);

     } catch (Exception e){
      System.out.println ("ERROR: " + e);
      e.printStackTrace (System.out);
    }
  }
}

IRPManager.java

import NotificationIRPSystem.*;
import org.omg.CosNotification.*;
import org.omg.CosNotifyComm.*;
import org.omg.CosNotifyChannelAdmin.*;
import org.omg.CosNotifyFilter.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.PortableServer.*;


public class IRPManager
    extends SequencePushConsumerPOA
{

    public void disconnect_sequence_push_consumer()
    {
        System.out.println("Disconnected!");
    }

    public void push_structured_events(org.omg.CosNotification.StructuredEvent[] notifications) throws org.omg.CosEvent\
Comm.Disconnected
    {
        System.out.println("Received Event");
    }

    public void offer_change(org.omg.CosNotification.EventType[] added, org.omg.CosNotification.EventType[] removed) th\
rows org.omg.CosNotifyComm.InvalidEventType
    {
        System.out.println("Offer Change!");
    }
}

OUTPUT

14-Aug-2013 3:54:02 PM org.jacorb.orb.ORBSingleton <init>
INFO: created ORBSingleton
IOR===> IOR:000000000000001D49444C3A6F6D672E6F72672F434F5242412F4F626A6563743A312E3000000000000000010000000000000040000102000000000F3137322E33302E3132302E3135380000C06600000000000B4E616D655365727669636500000000010000000000000008000000004A414300
14-Aug-2013 3:54:03 PM org.jacorb.orb.giop.ClientConnectionManager getConnection
INFO: ClientConnectionManager: created new ClientGIOPConnection to 172.30.120.158:49254 (7bea5671)

14-Aug-2013 3:54:03 PM org.jacorb.orb.iiop.ClientIIOPConnection connect
INFO: Connected to 172.30.120.158:49254 from local port 57080
14-Aug-2013 3:54:03 PM org.jacorb.orb.iiop.ClientIIOPConnection close
INFO: Client-side TCP transport to 172.30.120.158:49254 closed.
14-Aug-2013 3:54:03 PM org.jacorb.orb.giop.ClientConnectionManager getConnection
INFO: ClientConnectionManager: created new ClientGIOPConnection to 10.20.0.4:49254 (58a17083)
14-Aug-2013 3:54:03 PM org.jacorb.orb.iiop.ClientIIOPConnection connect
INFO: Connected to 10.20.0.4:49254 from local port 52574
IOR:000000000000001849444C3A506F7274616C2F53657276696365733A312E300000000001000000000000007C000102000000000A31302E32302E302E3800C27B0000002000504D43000000040000000C2F466163746F7279504F4100000000040000000000000003564953030000000500070801FF000000000000000000000800000000564953000000000100000018000000000001000100000001050100010001010900000000
noti---->IOR:000000000000004449444C3A336770707361352E6F72672F4E6F74696669636174696F6E49525053797374656D2F4E6F74696669636174696F6E4952504F7065726174696F6E733A312E3000000000010000000000000088000102000000000A31302E32302E302E3800C27B0000002C00504D43000000040000000C2F466163746F7279504F4100000000104E4D534E41436F6E73756D6572322E3300000003564953030000000500070801FF000000000000000000000800000000564953000000000100000018000000000001000100000001050100010001010900000000
14-Aug-2013 3:54:03 PM org.jacorb.poa.AOM add
INFO: oid: 00 40 46 20 4B 4D 29 05 2A 07 10 06 30 46 38 14 14 1B 48 4C .@F KM).*...0F8...HL1B                                                          .object is activated
14-Aug-2013 3:54:03 PM org.jacorb.poa.POA getImplName
INFO: Using server ID (8624227886) for transient POA
MANAGER REF: IOR:000000000000003349444C3A6F6D672E6F72672F436F734E6F74696679436F6D6D2F53657175656E636550757368436F6E73756D65723A312E300000000000010000000000000050000102000000000E3137322E31362E32342E31353200B91900000020383632343232373838362F004046204B4D29052A07100630463814141B484C1B000000010000000000000008000000004A414300
OBJ NOTI SERVER: IOR:000000000000003349444C3A6F6D672E6F72672F436F734E6F74696679436F6D6D2F53657175656E636550757368436F6E73756D65723A312E300000000000010000000000000050000102000000000E3137322E31362E32342E31353200B91900000020383632343232373838362F004046204B4D29052A07100630463814141B484C1B000000010000000000000008000000004A414300
14-Aug-2013 3:54:03 PM org.jacorb.orb.giop.ClientConnectionManager getConnection
INFO: ClientConnectionManager: created new ClientGIOPConnection to 10.20.0.8:49787 (68e6ff0d)
14-Aug-2013 3:54:03 PM org.jacorb.orb.iiop.ClientIIOPConnection connect
INFO: Connected to 10.20.0.8:49787 from local port 35910
**************************************************************************org.jacorb.orb.giop.RequestOutputStream@1be1a408
14-Aug-2013 3:54:04 PM org.jacorb.orb.iiop.ClientIIOPConnection close
INFO: Client-side TCP transport to 10.20.0.8:49787 closed.
org.omg.CORBA.MARSHAL: Server-side Exception: null
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
    at org.jacorb.orb.SystemExceptionHelper.read(SystemExceptionHelper.java:222)
    at org.jacorb.orb.ReplyReceiver.getReply(ReplyReceiver.java:456)
    at org.jacorb.orb.Delegate._invoke_internal(Delegate.java:1418)
    at org.jacorb.orb.Delegate.invoke_internal(Delegate.java:1187)
    at org.jacorb.orb.Delegate.invoke(Delegate.java:1175)
    at org.omg.CORBA.portable.ObjectImpl._invoke(ObjectImpl.java:80)
    at NotificationIRPSystem.__NotificationIRPOperationsStub.attach_push(__NotificationIRPOperationsStub.java:288)
    at AlarmClient.main(AlarmClient.java:43)

I'm not really sure what's happening. I think maybe that the object I'm trying to marshal is different from what the server expects? I hope someone can help, let me know if you need more information or if I missed something.

UPDATE This is the _NotificationIRPOperationsStub code which contains attach_push

public java.lang.String attach_push(java.lang.String manager_reference, int time_tick, java.lang.String[] notification_category_set, java.lang.String filter) throws NotificationIRPSystem.AlreadySubscribed,NotificationIRPSystem.Attach,NotificationIRPSystem.AtLeast\
OneNotificationCategoryNotSupported,NotificationIRPSystem.ParameterNotSupported,NotificationIRPSystem.InvalidParameter
        {
                while(true)
                {
                        if(! this._is_local())
            {
                                org.omg.CORBA.portable.InputStream _is = null;
                                org.omg.CORBA.portable.OutputStream _os = null;
                                try
                                {
                                        _os = _request( "attach_push", true);
                                        java.lang.String tmpResult10 = manager_reference;
_os.write_string( tmpResult10 );
                                        _os.write_ulong(time_tick);
                                        NotificationIRPConstDefs.NotificationCategorySetHelper.write(_os,notification_category_set);
                                        java.lang.String tmpResult11 = filter;
_os.write_string( tmpResult11 );
System.out.println("**************************************************************************" + _os.toString());
                                        _is = _invoke(_os);
                                        java.lang.String _result = _is.read_string();
                                        return _result;
                                }
                                catch( org.omg.CORBA.MARSHAL m){
                                    m.printStackTrace();
                                    return m.getStackTrace().getClassName();
                                }
                                catch( org.omg.CORBA.portable.RemarshalException _rx )
                                        {
                                                continue;
                                        }
                                catch( org.omg.CORBA.portable.ApplicationException _ax )
                                {
                                        String _id = _ax.getId();
                                        try
                                        {
                                                if( _id.equals("IDL:3gppsa5.org/NotificationIRPSystem/AlreadySubscribed:1.0"))
                                                {
                                                        throw NotificationIRPSystem.AlreadySubscribedHelper.read(_ax.getInputStream());
                                                }
                                                else
                                                if( _id.equals("IDL:3gppsa5.org/NotificationIRPSystem/Attach:1.0"))
                                                {
                                                        throw NotificationIRPSystem.AttachHelper.read(_ax.getInputStream());
                                                }
                                                else
if( _id.equals("IDL:3gppsa5.org/NotificationIRPSystem/AtLeastOneNotificationCategoryNotSupported:1.0"))
                                                {
                                                        throw NotificationIRPSystem.AtLeastOneNotificationCategoryNotSupportedHelper.read(_ax.getInputStream());
                                                }
                                                else
                                                if( _id.equals("IDL:3gppsa5.org/NotificationIRPSystem/ParameterNotSupported:1.0"))
                                                {
                                                        throw NotificationIRPSystem.ParameterNotSupportedHelper.read(_ax.getInputStream());
                                                }
                                                else
                                                if( _id.equals("IDL:3gppsa5.org/NotificationIRPSystem/InvalidParameter:1.0"))
                                                {
                                                        throw NotificationIRPSystem.InvalidParameterHelper.read(_ax.getInputStream());
                                                }
                                                else{
                                                        throw new RuntimeException("Unexpected exception " + _id );
                                                }
                                        }
                                        finally
                                        {
                                                try
                                                {
                                                        _ax.getInputStream().close();
                                                }
                                                catch (java.io.IOException e)
                                                {
                                                        throw new RuntimeException("Unexpected exception " + e.toString() );
                                                }
                                        }
}
                        finally
                        {
                                if (_os != null)
                                {
                                        try
                                        {
                                                _os.close();
                                        }
                                        catch (java.io.IOException e)
                                        {
                                                throw new RuntimeException("Unexpected exception " + e.toString() );
                                        }
                                }
                                this._releaseReply(_is);
                    }
}
                else
                {
                        org.omg.CORBA.portable.ServantObject _so = _servant_preinvoke( "attach_push", _opsClass );
                        if( _so == null )
                                continue;
                        _NotificationIRPOperationsOperations _localServant = (_NotificationIRPOperationsOperations)_so.servant;
                        java.lang.String _result;
                        try
                        {
                                _result = _localServant.attach_push(manager_reference,time_tick,notification_category_set,filter);
                                if ( _so instanceof org.omg.CORBA.portable.ServantObjectExt)
                                        ((org.omg.CORBA.portable.ServantObjectExt)_so).normalCompletion();
                                return _result;
                        }
                    catch (NotificationIRPSystem.AlreadySubscribed ex)
 {
                                if ( _so instanceof org.omg.CORBA.portable.ServantObjectExt)
                                        ((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(ex);
                                throw ex;
                        }
                        catch (NotificationIRPSystem.Attach ex)
                        {
                                if ( _so instanceof org.omg.CORBA.portable.ServantObjectExt)
                                        ((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(ex);
                                throw ex;
                        }
                        catch (NotificationIRPSystem.AtLeastOneNotificationCategoryNotSupported ex)
                        {
                                if ( _so instanceof org.omg.CORBA.portable.ServantObjectExt)
                                        ((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(ex);
                                throw ex;
}
                        catch (NotificationIRPSystem.ParameterNotSupported ex)
                        {
                                if ( _so instanceof org.omg.CORBA.portable.ServantObjectExt)
                                        ((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(ex);
                                throw ex;
                        }
                        catch (NotificationIRPSystem.InvalidParameter ex)
                        {
                                if ( _so instanceof org.omg.CORBA.portable.ServantObjectExt)
                                        ((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(ex);
                                throw ex;
                        }
                        catch (RuntimeException re)
                        {
                                if ( _so instanceof org.omg.CORBA.portable.ServantObjectExt)
                ((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(re);
                                throw re;
                        }
                        catch (java.lang.Error err)
                        {
                                if ( _so instanceof org.omg.CORBA.portable.ServantObjectExt)
                                        ((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(err);
                                throw err;
                        }
                        finally
                        {
                                _servant_postinvoke(_so);
                        }
                }

                }
}

Thanks.

UPDATE # 2

Thanks to Brian for posting that version of the document. I took the IDL from there, and with a minor adjustment I was able to call attach_push with my objNotiServer. My next question is about how I can set my AlarmClient up to receive these notifications. My assumption is that I can call orb.run() and then when notifications come in, I will receive them in my IRPManager object, is that right?


回答1:


CORBA::MARSHAL exceptions usually occur because of one of these reasons:

  1. IDL mismatches between client and server (causing unexpected payload differences)
  2. Crappy ORB products that don't know how to unmarshal complex but valid payloads correctly

Reason #2 is really unlikely nowadays, as ORBs have matured enough that this rarely happens. As long as you're using ORB products on both the client and server side that were built in this century then you're probably ok. That leaves reason #1.

The IDL for the method you're calling is (I believe) from this document, and looks like this:

interface NotificationIRPOperations {
  NotificationIRPConstDefs::SubscriptionId attach_push (
    in Object manager_reference,
    in long time_tick,
    in NotificationCategorySet notification_category_set,
    in string filter
  )
  raises (Attach, ParameterNotSupported, InvalidParameter, AlreadySubscribed,
          AtLeastOneNotificationCategoryNotSupported);

Note the first parameter, it's of type Object. However in your code, you're passing a string. However the IDL type Object maps to org.omg.CORBA.Object in Java, not to a String. I would have expected to see you pass objNotiServer instead for this parameter.

So either your IDL is mismatched with what your server is expecting (likely), or your IDL compiler isn't following the basic IDL-to-Java mapping rules (unlikely).

Either way, something smells bad there. I don't believe that the ORB will implicitly call ORB.string_to_object() for you, so that would lead to a regular string being sent on the network when the server is actually expecting a stringified Object reference. The difference is subtle but it might be the reason why the server is throwing a MARSHAL back at you.

So your first port of call should be a check on the IDL file that you're using to build your client. Make sure that you've got the exact and correct IDL for the server you're trying to call. If there's any mismatch at all then MARSHAL exceptions will happen, and happen a lot.




回答2:


The server side has a problem, therefor you receive the server side exception.

Your IDL is different on Server/Client which causes this error.

You have to look at the server's logfile. If you do not have access to the server, implement your own dummy-server and find out whether or not it works.

Regarding the manager_reference, test it in your own code via: narrow and a call to _non_existent(). I.e.

org.omg.CORBA.Object managerObj = orb.string_to_object(manager_reference);
IRPManager managerImpl = IRPManagerHelper.narrow(managerObj);
managerImpl._non_existent()

If this works, your IRPManager servant works.

By the way, you have a lot of unused imports and should refactor them. Your IDE would help you.

For Update2

Yout Alarmclient has to implement StructuredPushConsumer (see Initializing Corba notification service in java successfully but cannot get any events in linux but it's done in windows) and subscribe to the notifications.

But I recomment to open a new question.




回答3:


Your code looks suspicious, you never activate irpMan in the POA, but you do use servant_to_reference. Try the code below, handle it as pseudo code, I haven't tested it and I normally program C++.

   IRPManager irpMan = new IRPManager();
   POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
   poa.the_POAManager().activate();
   ObjectId id = poa.activate_object (irpMan);
   org.omg.CORBA.Object objNotiServer = poa.id_to_reference(id);
   String manager_reference = orb.object_to_string(objNotiServer);
   System.out.println("MANAGER REF: " + manager_reference);
   System.out.println("OBJ NOTI SERVER: " + objNotiServer);
   int time_tick = 15;
   String filter = "";
   String[] asd = {};
   NotificationIRPConstDefs.EventTypesSetHolder e_list = new NotificationIRPConstDefs.EventTypesSetHolder();
      NotificationIRPConstDefs.ExtendedEventTypesSetHolder ex_list = new NotificationIRPConstDefs.ExtendedEventTypesSet\
Holder();
   String cats[] = tt.get_notification_categories(e_list, ex_list);
   String res = tt.attach_push(objNotiServer, time_tick, asd , filter);


来源:https://stackoverflow.com/questions/18241579/org-omg-corba-marshal-server-side-exception-null

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