我正在尝试订阅类似于(org.omg.CORBA.MARSHAL:服务器端异常: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
我想这里的问题是,即使在 orb.init() 之后的新 CORBA 中使用命名服务,您也需要添加注册器。当您使用 orb 传递任何对象时,它会尝试检查该对象是否已在任何服务中注册。否则它开始整理数据。我正在查看您的代码,很快就会尝试找到解决方案
你明白了吗? 我正在尝试同样的事情,连接到爱立信 Corba 北向接口,但使用 Perl,而不是 Java。
您向 Attach_push() 发送了错误的对象,对象类型必须准确:
此外,您正在尝试发送 cats 中的所有类别,但包括事件和 qos。对于需要使用专有的 EventIRP 而不是 NotificationIRPSystem 的事件,您可能不需要的 qos。对于警报,您只能使用一个类别“1f1”。在 Perl 中,它是这样完成的:
my $category_set=NotificationIRPConstDefs::NotificationCategorySetOpt->new();
$category_set->value(["1f1"]);
尝试在 Java 中找出同样的东西。它对我来说还不起作用,工作仍在进行中......
问题解决了吗?如果是的话,你做了什么改变?