Я довольно новичок в 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.