Корба перезвонить сообщение не выводит - PullRequest
0 голосов
/ 15 октября 2019

Я довольно новичок в Corba, и мне трудно разобраться в теме обратных вызовов объектов при работе с распределенными системами. Я понял это в RMI, но не в Corba. У меня есть следующие фрагменты кода, которые несколько похожи на пример, найденный на https://docs.oracle.com/javase/8/docs/technotes/guides/idl/jidlExample3.html

У меня есть следующий файл IDL:

 module CallBack
 {
     interface CallBackInterface
     {
     void notifyMe(in string message);
     };
     interface CallBackServerInterface
     {
     void register(in CallBackInterface callback);
     };
  };

Затем я создал серверный сервер CallBackServer, который всеон отправляет сообщение методу notifyMe (указанному выше):

          public class CallBackServer extends CallBackServerInterfacePOA
          {
             public void register(CallBackInterface callback)
             {
               callback.notifyMe("Hello World");
             }
           }

Затем я создал объект client, который клиент передаст объекту corba:

          public class CallBackClient extends CallBackInterfacePOA
          {
           public void notifyMe(String message){

               System.out.println(message);
           }
           }

Iзатем создал Сервер:

          public class CBServer 
          {
             public static void main(String[]args)
             {
                try
                {
                  ORB orb = ORB.init(args,null);
                  POA rootPOA =POAHelper.narrow(orb.resolve_initial_references("RootPOA"));//step to activate and name root POA
                  rootPOA.the_POAManager().activate();
                  CallBackServer s = new CallBackServer();
                  org.omg.CORBA.Object ref = rootPOA.servant_to_reference(s);
                  CallBackServerInterface cb = CallBackServerInterfaceHelper.narrow(ref);
                  org.omg.CORBA.Object objref = orb.resolve_initial_references("NameService");
                  NamingContextExt ncRef = NamingContextExtHelper.narrow(objref);
                  NameComponent path[] = ncRef.to_name("CallBack");
                  ncRef.rebind(path,cb);
                  System.out.println("Server is running");
                  orb.run();
                 }
                 catch(Exception e)
                 {
                 System.out.println("Error in server: " + e);
                 }

                }
            }

Наконец, я создал Клиент (вот где возникают мои проблемы):

        public class CBClient 
        {
             static CallBackServerInterface cb;
             public static void main(String[]args)
             {
                ORB orb = ORB.init(args,null);
                try
                {
                  org.omg.CORBA.Object objRef = 
                  orb.resolve_initial_references("NameService");
                  NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
                  cb= CallBackServerInterfaceHelper.narrow(ncRef.resolve_str("CallBack")); 
                  POA rootPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
                  CallBackClient c =   new CallBackClient();
                  rootPOA.activate_object(c);
                  CallBackInterface i = 
          CallBackInterfaceHelper.narrow(rootPOA.servant_to_reference(c));
                 cb.register(i);//will print on server

               }
               catch(Exception e)
                {
                System.out.println("Error in Client" + e);
                }
              }
            }

Извините за формат клиента, я попытался отформатироватьтекст и это то, что я смог получить.

Проблема с клиентом заключается в том, что когда cb.register (i);вызывается он вызывает метод register () на сервере, но в строке "callback.notifyMe (" Hello World ");" кажется, что программа никогда не вызывает этот метод, и по какой-то причине система, кажется, работает вбесконечный цикл, поскольку клиент не останавливается.

Любая помощь будет полезна для лучшего понимания работы Corba.

...