web-servicesmarshallingcorbajacorb

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


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?


Solution

  • 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.