org.omg.ORBA.MARSHAL:服务器端异常:null



我正在尝试注册到CORBA CosNotification服务。在我试图连接到的服务的文档中,它说我必须连接到一个CosNotifyComm::SequencePushConsumer对象,并将其附加到通知服务。我已经包含了我的代码,我正在返回错误。

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

输出

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)

我真的不确定发生了什么。我想我试图封送的对象可能与服务器期望的不同?我希望有人能帮忙,如果你需要更多信息或我错过了什么,请告诉我。

更新这是包含attach_push 的_NotificationIRPOOperationsStub代码

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

谢谢。

更新#2

感谢Brian发布该版本的文档。我从那里取了IDL,经过一个小的调整,我可以用我的objNotiServer调用attach_push。我的下一个问题是如何设置我的AlarmClient来接收这些通知。我的假设是,我可以调用orb.run(),然后当通知到来时,我会在我的IRPManager对象中收到它们,对吗?

CORBA::MARSHAL异常通常是由于以下原因之一而发生的:

  1. 客户端和服务器之间的IDL不匹配(导致意外的负载差异)
  2. Crappy ORB产品不知道如何正确分解复杂但有效的有效载荷

原因#2现在真的不太可能,因为ORB已经足够成熟,很少发生这种情况。只要你在客户端和服务器端都使用本世纪构建的ORB产品,那么你可能就可以了。

您正在调用的方法的IDL(我相信)来自本文档,看起来如下:

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

注意第一个参数,它的类型是Object。然而,在您的代码中,您正在传递一个字符串。但是IDL类型Object在Java中映射到org.omg.CORBA.Object,而不是String。我本来希望看到您为这个参数传递objNotiServer

因此,要么您的IDL与服务器期望的不匹配(很可能),要么IDL编译器没有遵循基本的IDL到Java映射规则(不太可能)。

不管怎样,那里都有臭味。我不相信ORB会隐式地为您调用ORB.string_to_object(),所以当服务器实际期望一个字符串化的Object引用时,这会导致在网络上发送一个常规字符串。差异很微妙,但这可能是服务器向您抛出MARSHAL的原因。

因此,您的第一个调用端口应该是对用于构建客户端的IDL文件的检查。确保您已经获得了要调用的服务器的准确无误的IDL。如果有任何不匹配,那么MARSHAL异常就会发生,而且会经常发生。

服务器端出现问题,因此您收到服务器端异常。

服务器/客户端上的IDL不同,这会导致此错误。

您必须查看服务器的日志文件。如果您没有访问服务器的权限,请实现自己的虚拟服务器,并确定它是否工作。

关于manager_reference,请通过:narrow和对_non_existent()的调用在您自己的代码中进行测试。即

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

如果这有效,你的IRPManager仆人也有效。

顺便说一下,您有很多未使用的导入,应该对它们进行重构。IDE会对您有所帮助。

对于Update2

Yout Alarmclient必须实现StructuredPushConsumer(请参阅在java中成功初始化Corba通知服务,但在linux中无法获得任何事件,但它在windows中完成)并订阅通知。

但我建议打开一个新问题

您的代码看起来可疑,您从未在POA中激活irpMan,但您确实使用了servant_to_reference。试试下面的代码,把它当作伪代码处理,我还没有测试过,我通常用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);

相关内容

  • 没有找到相关文章

最新更新