Сценарий:
Я реализую пример 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)
Спасибо!