2015-04-15 3 views
2

Я следил за кучей учебников по этому бизнесу RMI, чтобы узнать, как это сделать правильно. Учебник Oracle использует SecurityManager, в то время как большинство других не беспокоит. Некоторые из них удлиняют UnicastRemoteObject, а другие exportObject. Некоторые запускают RMIRegistry снаружи и getRegistry, а другие createRegistry.Приложение RMI Server не работает (тихо завершается)

Теперь, я подумал, что было бы полезно для меня, чтобы вишня выбрать из этих вариантов передо мной, так вот что я сделал:

Во-первых, я пошел за безопасность, так почему не?

Во-вторых, я не хотел расширять UnicastRemoteObject, потому что мой объект не совсем удален, просто есть некоторые удаленные методы. Мне просто не показалось, что у меня, например, есть предложение throws RemoteException на его конструкторе.

И, наконец, я не хотел запускать реестр извне, потому что я на самом деле не сервер, это просто приложение. Кроме того, я не хотел иметь два/три отдельных места для установки порта для реестра.

Вот мой код для сервера один, (надеюсь) делать вещи, которые я описал:

package server; 

import interf.TicTacToeBoard; 

import java.rmi.AlreadyBoundException; 
import java.rmi.RemoteException; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 
import java.rmi.server.UnicastRemoteObject; 

public class TicTacToeServer 
{ 
    private static Registry registry; 

    public static void main(String[] args) 
     throws RemoteException, AlreadyBoundException 
    { 
     System.out.println("Server is up!"); 

     System.setProperty("java.security.policy", "file:/<policy_file_path>"); 

     if (System.getSecurityManager() == null) 
      System.setSecurityManager(new SecurityManager()); 

     TicTacToeBoardImpl arena = new TicTacToeBoardImpl(); 
     TicTacToeBoard stub = 
      (TicTacToeBoard) UnicastRemoteObject.exportObject(arena, 0); 

     registry = LocateRegistry.createRegistry(TicTacToeBoard.RMI_PORT); 
     registry.bind(TicTacToeBoard.RMI_NAME, stub); 

     System.out.println("Waiting for connections."); 
    } 
} 

Эта вещь не завершена; но с точки зрения возможности обслуживать удаленный объект, это должно быть. Однако после печати этой строки с "Waiting for connections." приложение просто тихо завершает работу.

Мое единственное объяснение этому заключается в том, что приложение получает сбор мусора.

Это не приведет к сбору мусора в примере Oracle, поскольку там RMIRegistry запускается как отдельное приложение из серверного приложения, а приложение RMIRegistry содержит ссылку на объект, находящийся внутри серверного приложения.

Он не получает сбор мусора, когда моя реализация extends UnicastRemoteObject, потому что ... я не знаю. Все, что я знаю, это то, что приложение продолжает работать.

Пожалуйста, исправьте меня, если я ошибаюсь на любом этапе. Кроме того, мой вопрос в том, каковы мои варианты, которые не включают запуск RMIRegistry в качестве отдельного процесса, и моя реализация расширяет UnicastRemoteObject?

+0

Ум, ваш основной метод возвращается, поэтому ваш процесс заканчивается? – bmargulies

+0

Невозможно воспроизвести. @bmargulies № – EJP

+0

У меня такая же проблема. Мне действительно нужно исправить это до крайнего срока. – Tvde1

ответ

0

Этого не должно быть. Существование двух удаленных объектов должно поддерживать поток прослушивания порта, а статическая переменная должна поддерживать объект реестра. Попробуйте сделать реализацию и статические поля stub, такие как реестр.

Я пошел за безопасностью, потому что почему бы и нет?

Но почему? Это просто боль в шее, если вы не будете запускать ненадежный код или на чужой компьютер.

1: Действительно, со мной это не происходит. Он продолжает работать. Вы уверены, что ваша ссылка Registry действительно static?

+0

Если вы не имеете в виду нечто иное, чем декларация 'static' за поле' registry', да, я уверен. Код, который у меня есть, - это то, что я опубликовал, но, конечно, путь к файлу политики - это путь к файлу политики. И поскольку я могу назвать 'exportObject', я также уверен, что мои объекты прямо или косвенно реализуют интерфейс' Remote'. – ThoAppelsin

+0

Я пытаюсь сделать это прямо на Eclipse Luna, если это имеет значение. – ThoAppelsin

+0

Я попробовал его с локальным полем 'Registry' вместо статического поля. Потребовалось час, чтобы выйти из-за интервала аренды DGC. Вы уверены, что не было исключено исключение? – EJP

Смежные вопросы