Web services org.omg.CORBA.MARSHAL:服务器端异常:null

Web services org.omg.CORBA.MARSHAL:服务器端异常:null,web-services,marshalling,corba,jacorb,Web Services,Marshalling,Corba,Jacorb,我正在尝试注册一个CORBA通知服务。在我试图连接到的服务的文档中,它说我必须连接到一个CosNotifyComm::SequencePushConsumer对象,并将其附加到通知服务。我已经包含了我的代码,以及我要返回的错误 AlarmClient.java import NotificationIRPSystem.*; import org.omg.CosNotification.*; import org.omg.CosNotifyComm.*; import org.omg.CosNot

我正在尝试注册一个CORBA通知服务。在我试图连接到的服务的文档中,它说我必须连接到一个
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);
    }
  }
}
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!");
    }
}
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 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);
    }
  }
}
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)
谢谢

更新#2


感谢Brian发布了该版本的文档。我从那里获取了IDL,只需稍作调整,就可以用我的
objNotiServer
调用
attach\u push
。我的下一个问题是如何设置我的
AlarmClient
以接收这些通知。我的假设是,我可以调用
orb.run()
,然后当通知传入时,我将在我的IRPManager对象中接收它们,对吗

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

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

服务器端有问题,因此您收到服务器端异常

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

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

关于
manager\u参考
,请通过以下方式在您自己的代码中进行测试:
shorrow
,并调用
\u non\u existence()
。即

org.omg.CORBA.Object managerObj = orb.string_to_object(manager_reference);
IRPManager managerImpl = IRPManagerHelper.narrow(managerObj);
managerImpl._non_existent()
如果这样做有效,您的IRPManager仆人也会起作用

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

对于更新2

Yout Alarmclient必须实现StructuredPushConsumer(请参阅)并订阅通知


但是我建议打开一个新问题

服务器端有问题,因此您会收到服务器端异常

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

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

关于
manager\u参考
,请通过以下方式在您自己的代码中进行测试:
shorrow
,并调用
\u non\u existence()
。即

org.omg.CORBA.Object managerObj = orb.string_to_object(manager_reference);
IRPManager managerImpl = IRPManagerHelper.narrow(managerObj);
managerImpl._non_existent()
如果这样做有效,您的IRPManager仆人也会起作用

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

对于更新2

Yout Alarmclient必须实现StructuredPushConsumer(请参阅)并订阅通知


但我建议打开一个新问题

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

  • 客户端和服务器之间的IDL不匹配(导致意外的负载差异)
  • 糟糕的ORB产品,不知道如何正确解组复杂但有效的有效负载
  • 原因2如今真的不太可能了,因为球体已经足够成熟,这种情况很少发生。只要您在本世纪构建的客户端和服务器端都使用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
    ,而不是映射到
    字符串。我本希望看到您通过
    objNotiServer
    而不是此参数

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

    不管怎样,那里有些东西闻起来很难闻。我不相信ORB会为您隐式地调用
    ORB.string\u to\u object()
    ,因此,当服务器实际需要字符串化对象引用时,这将导致在网络上发送常规字符串。区别很微妙,但这可能是服务器向您抛出
    封送处理的原因


    因此,您的第一个调用端口应该是检查用于构建客户机的IDL文件。确保您为您试图调用的服务器获得了准确的IDL。如果存在任何不匹配,则会发生异常,并且会发生很多异常。

    CORBA::封送异常通常是由于以下原因之一:

  • 客户端和服务器之间的IDL不匹配(导致意外的负载差异)
  • 糟糕的ORB产品,不知道如何正确解组复杂但有效的有效负载
  • 原因2如今真的不太可能了,因为球体已经足够成熟,这种情况很少发生。只要您在本世纪构建的客户端和服务器端都使用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
    ,而不是映射到
    字符串。我本希望看到您通过
    objNotiServer
    而不是此参数

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

    不管怎样,那里有些东西闻起来很难闻。我不知道