2016-02-16 2 views
-1

Я разрабатываю два приложения, которые общаются друг с другом через RMI, с одним помещением данных в свою локальную очередь, а другой - для опроса очереди для данных удаленно. подход однопользовательской связи между производителями и потребителями. Были некоторые обновления, и теперь мне нужно сделать связь двусторонней, и для этого требуется использовать два опроса RMI. По-видимому, я не могу запустить два start rmiregistry на одной машине. Что мне делать? Есть ли обходной путь для этого? Мне нужно запустить два приложения параллельно в двух разных проектах в Eclipse!Запустить два приложения RMI на одной машине и одну IDE

Код RMI для обоих приложений такой же, как указано ниже. Поэтому в основном, когда я запускаю первый, а затем второй, он генерирует исключение в следующем.

try { 
      ServerRMI obj = new ServerRMI(); 
      Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0); 

      // Bind the remote object's stub in the registry 
      Registry registry = LocateRegistry.getRegistry(); 
      registry.bind("Hello", stub); 
      System.err.println("Server ready"); 
     } catch (Exception e) { 
      System.err.println("Server exception: " + e.toString()); 
      e.printStackTrace(); 
     } 

И исключение:

Server exception: java.rmi.AlreadyBoundException: Hello 
java.rmi.AlreadyBoundException: Hello 
    at sun.rmi.registry.RegistryImpl.bind(RegistryImpl.java:183) 
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source) 
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:410) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:268) 
    at sun.rmi.transport.Transport$1.run(Transport.java:200) 
    at sun.rmi.transport.Transport$1.run(Transport.java:197) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$240(TCPTransport.java:683) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$1/305254903.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source) 
    at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source) 
    at sun.rmi.server.UnicastRef.invoke(Unknown Source) 
    at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source) 
    at test.ServerRMI.main(ServerRMI.java:26) 
+0

Eclipse - это IDE; у него нет ничего общего с этим. Вам нужны два разных порта, вот и все. – duffymo

+0

Я знаю, но мне не нужно запускать две «rmiregistry»? Я не могу этого сделать. Только один запускается в любое время! –

+1

http://www.javaworld.com/article/2072868/viewing-names-bound-to-rmi-registry.html. Несколько имен, каждый со своим хостом и портом. – duffymo

ответ

1

Вам не нужны два RMI реестров. Одного достаточно.

+0

Я сейчас немного смущен с моим приложением. Я поиграю с ним и посмотрю, как это происходит ... –

+0

Я пытался запустить второе приложение RMI, но он бросает java.rmi.AlreadyBoundException: Hello. Должен ли я изменить номер порта? Я обновил свой вопрос с подробной информацией. –

+0

OK. Наверное, я понял это. По-видимому, я должен различать их по портам с помощью 'LocateRegistry.createRegistry (int port)' –