CORBA通知订阅(错误:org.omg.CORBA.MARSHAL:vmcid:0x0次要代码:0已完成:否)

时间:2015-02-09 03:17:21

标签: java notifications marshalling corba nms

我正在尝试订阅与(org.omg.CORBA.MARSHAL: Server-side Exception: null)!类似的通知服务和消费者警报,但会收到编组错误。非常感谢有人可以帮助我解决我所缺少或做错的事情。

idls文件来自NotificationIRP idls并使用jacorb-3.5 api。

NotificationConsumer.java

import org.omg.CORBA.*;
import org.omg.CORBA.ORB;
import org.omg.CosNotification.*;
import org.omg.CosNotifyComm.*;
import org.omg.CosNotifyChannelAdmin.*;
import org.omg.CosNotifyFilter.*;
import org.omg.CosNaming.*;
import org.omg.PortableServer.*;

import NotificationIRPSystem.*;
//import AlarmIRPSystem.*;
import java.io.*;

public class NotificationConsumer {

    private static String notifIRPName = "com/ericsson/nms/cif/service/NMSNAConsumer";
    private static String notifIRPPortal = "com/ericsson/nms/cif/service/NMSNAPortal";

    public static void main(String args[]) throws IOException {
  try{
  //initialize ORB
   org.omg.CORBA.ORB orb = ORB.init(args, null);

  //read stringified object from file
  FileReader fr = new FileReader("ExternalNamingService.1");
  BufferedReader br = new BufferedReader(fr);
  String ior = br.readLine();
  org.omg.CORBA.Object obj = orb.string_to_object(ior);

  NamingContextExt ncRef = NamingContextExtHelper.narrow(obj);
  org.omg.CORBA.Object notiObj = ncRef.resolve_str(notifIRPName);

  //get notification operations object
  NotificationIRPOperations nOps = NotificationIRPOperationsHelper.narrow(notiObj);
  System.out.println("NOTIFICATION|" + nOps);

  //activate poa manager
  IRPManager iManager = new IRPManager();
  POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
  poa.the_POAManager().activate();
  org.omg.CORBA.Object notiServerObj = poa.servant_to_reference(iManager);

  //subscribe to notifications
  String manager_reference = orb.object_to_string(notiServerObj);
  System.out.println("MANAGER REF|" + manager_reference);
  int time_tick = 15;
  String filter = "";
  String[] asd = {};
  NotificationIRPConstDefs.EventTypesSetHolder e_list = new NotificationIRPConstDefs.EventTypesSetHolder();
  NotificationIRPConstDefs.ExtendedEventTypesSetHolder ex_list = new NotificationIRPConstDefs.ExtendedEventTypesSetHolder();
  String cats[] = nOps.get_notification_categories(e_list, ex_list);

  String vers[] = nOps.get_notification_IRP_version();
  for (String ver : vers){
    System.out.println("notification IRP version is: " + ver);
  }

  String resp = nOps.attach_push(manager_reference, time_tick, cats, filter);

  //print subscription ids
  String subs[] = nOps.get_subscription_ids(manager_reference);
  for (String sub : subs){
    System.out.println("subscription id: "+sub);
  }

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

} }

结果

NOTIFICATION|IOR:000000000000004449444c3a336770707361352e6f72672f4e6f74696669636174696f6e49525053797374656d2f4e6f74696669636174696f6e4952504f7065726174696f6e733a312e300000000001000000000000008c000102000000000d31302e3234372e34362e32330000c27b0000002c00504d43000000040000000c2f466163746f7279504f4100000000104e4d534e41436f6e73756d6572322e3300000003564953030000000500070801ff000000000000000000000800000000564953000000000100000018000000000001000100000001050100010001010900000000
MANAGER REF|IOR:000000000000003349444c3a6f6d672e6f72672f436f734e6f74696679436f6d6d2f53657175656e636550757368436f6e73756d65723a312e30000000000001000000000000008a000102000000000f31302e3136312e3133302e3131300000b0b8000000000031afabcb00000000206c4ce5e000000001000000000000000100000008526f6f74504f410000000008000000010000000014000000000000020000000100000020000000000001000100000002050100010001002000010109000000010001010000000026000000020002
notification IRP version is: 1n1
ERROR: org.omg.CORBA.MARSHAL:   vmcid: 0x0  minor code: 0  completed: No
org.omg.CORBA.MARSHAL:   vmcid: 0x0  minor code: 0  completed: No
     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:526)
    at java.lang.Class.newInstance(Class.java:379)
    at com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase.getSystemException(MessageBase.java:916)
    at com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage_1_2.getSystemException(ReplyMessage_1_2.java:116)
    at com.sun.corba.se.impl.protocol.CorbaMessageMediatorImpl.getSystemExceptionReply(CorbaMessageMediatorImpl.java:590)
    at com.sun.corba.se.impl.protocol.CorbaClientRequestDispatcherImpl.processResponse(CorbaClientRequestDispatcherImpl.java:489)
    at com.sun.corba.se.impl.protocol.CorbaClientRequestDispatcherImpl.marshalingComplete(CorbaClientRequestDispatcherImpl.java:373)
    at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:147)
    at org.omg.CORBA.portable.ObjectImpl._invoke(ObjectImpl.java:475)
    at NotificationIRPSystem._NotificationIRPOperationsStub.attach_push(_NotificationIRPOperationsStub.java:26)
    at NotificationConsumer.main(NotificationConsumer.java:59)
发生错误的

_NotificationIRPOperationsStub.attach_push($ in = _invoke($ out);)

  /**
  * NotificationIRPSystem/_NotificationIRPOperationsStub.java .
  * Generated by the IDL-to-Java compiler (portable), version "3.2"
  * from NotificationIRPSystem.idl
  * Wednesday, 4 February 2015 3:49:56 PM EST
  */

  public class _NotificationIRPOperationsStub extends   org.omg.CORBA.portable.ObjectImpl implements   NotificationIRPSystem.NotificationIRPOperations
  {
   /* ## Operation: attach_push
   */
   public String attach_push (String manager_reference, int time_tick, String[] notification_category_set, String filter) throws NotificationIRPSystem.Attach, NotificationIRPSystem.ParameterNotSupported, NotificationIRPSystem.InvalidParameter, NotificationIRPSystem.AlreadySubscribed, NotificationIRPSystem.AtLeastOneNotificationCategoryNotSupported
   {
             org.omg.CORBA.portable.InputStream $in = null;
             try {
                org.omg.CORBA.portable.OutputStream $out = _request ("attach_push", true);
                 $out.write_string (manager_reference);
                 $out.write_long (time_tick);
               NotificationIRPConstDefs.NotificationCategorySetHelper.write ($out, notification_category_set);
                 $out.write_string (filter);
                 $in = _invoke ($out);
                 String $result = NotificationIRPConstDefs.SubscriptionIdHelper.read ($in);
                 return $result;
             } catch (org.omg.CORBA.portable.ApplicationException $ex) {
            $in = $ex.getInputStream ();
            String _id = $ex.getId ();
                 if (_id.equals ("IDL:3gppsa5.org/NotificationIRPSystem/Attach:1.0"))
                throw NotificationIRPSystem.AttachHelper.read ($in);
                 else if (_id.equals ("IDL:3gppsa5.org/NotificationIRPSystem/ParameterNotSupported:1.0"))
                     throw  NotificationIRPSystem.ParameterNotSupportedHelper.read ($in);
                 else if (_id.equals ("IDL:3gppsa5.org/NotificationIRPSystem/InvalidParameter:1.0"))
                     throw NotificationIRPSystem.InvalidParameterHelper.read ($in);
                 else if (_id.equals ("IDL:3gppsa5.org/NotificationIRPSystem/AlreadySubscribed:1.0"))
                     throw NotificationIRPSystem.AlreadySubscribedHelper.read ($in);
                 else if (_id.equals ("IDL:3gppsa5.org/NotificationIRPSystem/AtLeastOneNotificationCategoryNotSupported:1.0"))
                     throw NotificationIRPSystem.AtLeastOneNotificationCategoryNotSupportedHelper.read ($in);
                 else
                     throw new org.omg.CORBA.MARSHAL (_id);
            } catch (org.omg.CORBA.portable.RemarshalException $rm) {
                return attach_push (manager_reference, time_tick, notification_category_set, filter        );
            } finally {
                _releaseReply ($in);
             }
   } // attach_push

2 个答案:

答案 0 :(得分:0)

我想这里的问题是你需要在orb.init()之后立即在新的CORBA中使用命名服务之前添加注册器。当您使用orb传递任何对象时,它会尝试检查是否已在任何服务中注册。否则它会开始编组数据。我在里面看你的代码会尽快找到解决方案

答案 1 :(得分:0)

你有没有想到这一点? 我正在尝试相同的事情,连接到爱立信Corba北向接口,但是在Perl中,而不是在Java中。

您要向attach_push()发送错误的对象,对象类型必须完全符合:

  • manager_reference:plain string,
  • time_tick:ManagedGenericIRPConstDefs :: UnsignedLongOpt, 不是代码中的int!
  • cats:NotificationIRPConstDefs :: NotificationCategorySet, 不是字符串数组。
  • filter:ManagedGenericIRPConstDefs :: StringOpt, 不是字符串。

此外,您正在尝试发送猫的所有类别,但包括事件和qos。对于事件,您需要使用专有的EventIRP而不是NotificationIRPSystem和qos,您可能不需要。对于警报,您只能使用一个类别“1f1”。在Perl中,它是这样完成的:

<div class="vote">
     <ul class="btn-vote left">
           <li><a class="badge-item-vote-up up " href="javascript:void(0);" rel="nofollow">Upvote</a></li>
           <li><a class="badge-item-vote-down down " href="javascript:void(0);" rel="nofollow">Downvote</a></li>
     </ul>
</div>

尝试在Java中找出相同的东西。它还没有为我工作,工作仍在进行中......