Два реестра RMI на одном ПК, NotBoundException - PullRequest
0 голосов
/ 12 октября 2011

Сценарий: Я реализую пример RMI между двумя ПК, где ПК-контроллер запрашивает информацию у ПК-агента. ПК-агент может запускать Xen или KVM, поэтому реализации запросов различаются (причина использования RMI). На стороне Агента я использую 2 реестра RMI, привязанных к двум разным портам. Когда тот же пример выполняется только с 1 Реестром на стороне агента, все работает отлично.

Вот мой код: Контроллер. Java (содержит main () на стороне контроллера):

public class Controller {

NetworkDiscovery n;
public static int discoveryInterval=2000;
static public PM pmlist;

public static void main(String[] args) throws UnknownHostException,NotBoundException, `   MalformedURLException, RemoteException {

pmOperations pm=(pmOperations)Naming.lookup("rmi://Agent_IP/RMIService1");
boolean l= pm.CreateVM("apple3","/var/lib/libvirt/images",1,200);
System.out.println(l);

vmOperations vm=(vmOperations)Naming.lookup("rmi://Agent_IP/RMIService2");
boolean ShutdownVM = vm.ShutdownVM("apple1");
System.out.println(ShutdownVM);
//other code
}

pmOperations.java (на стороне контроллера) (на стороне агента он имеет то же определение с кодом реализации внутри функции)

public interface pmOperations extends java.rmi.Remote{
    public boolean CreateVM(String vmName,String imgSrc, int allotCPU, int allotMem )
    throws java.rmi.RemoteException;
}

vmOperations.java (на стороне контроллера) (на стороне агента он имеет то же значение с кодом реализации внутри функции)

public interface vmOperations extends java.rmi.Remote{
    boolean ChangeVMParam(String vmName,String paramName,String paramValue)
    throws java.rmi.RemoteException;
}

Agent.java

public class Agent {

Agent() throws RemoteException, MalformedURLException{
    Registry RMIService1 = LocateRegistry.createRegistry(1099);

    Registry RMIService2 = LocateRegistry.createRegistry(4478);

        vmOperations vmOp = new kvmVM();
        pmOperations pmOp = new kvmPM();

      Naming.rebind("rmi://localhost:1099/RMIService1", pmOp);
      Naming.rebind("rmi://localhost:4478/RMIService2", vmOp);
}

public static void main(String[] args) throws SocketException, UnknownHostException, IOException, LibvirtException {

        System.out.println("Inside main ");
        new Agent();
        //other code
}
}

Ошибка при выполнении кода выше на стороне контроллера - нет ошибки на стороне агента:

Исключение в потоке "main" java.rmi.NotBoundException: RMIService2 at sun.rmi.registry.RegistryImpl.lookup (RegistryImpl.java:106) at sun.rmi.registry.RegistryImpl_Skel.dispatch (неизвестный источник) at sun.rmi.server.UnicastServerRef.oldDispatch (UnicastServerRef.java:386) at sun.rmi.server.UnicastServerRef.dispatch (UnicastServerRef.java:250) на sun.rmi.transport.Transport $ 1.run (Transport.java:159) at java.security.AccessController.doPrivileged (собственный метод) at sun.rmi.transport.Transport.serviceCall (Transport.java:155) в sun.rmi.transport.tcp.TCPTransport.handleMessages (TCPTransport.java:535) в sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0 (TCPTransport.java:790) в sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run (TCPTransport.java:649) в java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:886) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:908) на java.lang.Thread.run (Thread.java:662) at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer (StreamRemoteCall.java:255) at sun.rmi.transport.StreamRemoteCall.executeCall (StreamRemoteCall.java:233) at sun.rmi.server.UnicastRef.invoke (UnicastRef.java:359) at sun.rmi.registry.RegistryImpl_Stub.lookup (неизвестный источник) на java.rmi.Naming.lookup (Naming.java:84) в package1.Controller.main (Controller.java:43)

Спасибо!

1 Ответ

2 голосов
/ 13 октября 2011

Вы не можете создать два реестра в одной виртуальной машине Java. Вам не нужны два реестра на одном хосте. Вам не нужно создавать два экземпляра удаленного объекта.

Просто создайте один реестр, один удаленный объект и привязывайте его к реестру дважды, один раз с каждым именем. Вам действительно не нужно связывать это дважды либо на самом деле либо. В этом дизайне много бессмысленного дублирования.

...