org.omg.CORBA.MARSHAL: Исключение на стороне сервера: null

Я пытаюсь зарегистрироваться в Службе CosNotification от 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);
    }
  }
}

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)

Я не совсем уверен, что происходит. Я думаю, что объект, который я пытаюсь маршалировать, отличается от того, что ожидает сервер? Я надеюсь, что кто-то может помочь, дайте мне знать, если вам нужна дополнительная информация или я что-то пропустил.

ОБНОВЛЕНИЕ Это код _NotificationIRPOperationsStub, который содержит 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);
                        }
                }

                }
}

Благодарю.

ОБНОВЛЕНИЕ № 2

Спасибо Брайану за публикацию этой версии документа. Я взял IDL оттуда, и с небольшой поправкой я смог позвонить attach_push со мной objNotiServer, Мой следующий вопрос о том, как я могу установить свой AlarmClient до получения этих уведомлений. Я предполагаю, что я могу позвонить orb.run() и затем, когда приходят уведомления, я получу их в своем объекте IRPManager, верно?

3 ответа

Решение

CORBA::MARSHAL исключения обычно происходят по одной из следующих причин:

  1. Несоответствие IDL между клиентом и сервером (вызывая неожиданные различия полезной нагрузки)
  2. Сумасшедшие продукты ORB, которые не знают, как правильно распаковывать сложные, но корректные данные

Причина № 2 действительно маловероятна в настоящее время, так как ORB достаточно созрели, чтобы это случалось редко. Пока вы используете продукты ORB как на стороне клиента, так и на стороне сервера, которые были созданы в этом столетии, вы, вероятно, в порядке. Это оставляет причину № 1.

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 карты для org.omg.CORBA.Object в Java, а не в String, Я бы ожидал увидеть тебя пройти objNotiServer вместо этого для этого параметра.

Таким образом, либо ваш IDL не соответствует тому, что ожидает ваш сервер (вероятно), либо ваш компилятор IDL не следует основным правилам отображения IDL в Java (маловероятно).

В любом случае, там плохо пахнет. Я не верю, что ORB неявно позвонит ORB.string_to_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 поможет вам.

Для обновления2

Yout Alarmclient должен реализовать StructuredPushConsumer (см. Успешная инициализация службы уведомлений Corba в Java, но не может получить никаких событий в Linux, но это сделано в Windows) и подписаться на уведомления.

Но я рекомендую открыть новый вопрос.

Ваш код выглядит подозрительно, вы никогда не активируете irpMan в POA, но вы используете 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);
Другие вопросы по тегам