Сервер RMI останавливается? - PullRequest
1 голос
/ 02 марта 2011

Как мне сохранить работоспособность сервера RMI? В настоящее время он просто связывает и возражает, затем выходит ..

public class WutServer {
  public static void main(String[] args) throws RemoteException {
    Registry registry = LocateRegistry.createRegistry(1099);
    try {
      registry.bind("WutManager", new WutManager());
      System.out.println("Ready..");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Я просто управляю этим классом. Я не бегал RMS или что-нибудь еще ...

Как заставить его работать?

Ответы [ 5 ]

2 голосов
/ 02 марта 2011

Попробуйте это:

Remote stub = UnicastRemoteObject.exportObject(new WutManager(), 0);
Registry registry = LocateRegistry.createRegistry(1099);
registry.rebind("WutManager", stub);

Примечание: WutManager должен реализовать java.rmi.Remote.

1 голос
/ 22 марта 2011

Ваш сервер DGC'd, а затем GC'd, что вызывает его неэкспортирование, что в конечном итоге приводит к выходу JVM, если ему больше нечего делать. Чтобы остановить это, если вы создаете реестр с помощью LocateRegistry.createRegistry(), сохраните возвращаемое значение этого метода в статической переменной. В противном случае сохраните статическую ссылку на объект вашего сервера.

0 голосов
/ 02 февраля 2018

Это старый вопрос, но вот новый ответ.

В OSX, используя последнюю версию Java 9.0.4, я обнаружил, что программа завершается. Если я использую последнюю версию Java 1.8.0.162, то она не завершается и сервер продолжает работать.

0 голосов
/ 17 октября 2011

Создание объекта и ожидание вызова объекта в конце основной функции. То есть;

public static void main(String[] args) throws RemoteException {
    Registry registry = LocateRegistry.createRegistry(1099);

    //your object to wait
    Object lockObject=new Object();

    try {            
              registry.bind("WutManager", new WutManager());            
              System.out.println("Ready..");

              //here makes your rmi server non-stop
              synchronized(lockObject){
                    lockObject.wait();
              }
     }catch (Exception e) {            
              e.printStackTrace();          
     } 
}
0 голосов
/ 02 марта 2011

Вам нужно , чтобы WutServer реализовал интерфейс, через который клиенты будут получать к нему доступ, который, в свою очередь, должен наследоваться от интерфейса маркера Remote.Вы также, вероятно, хотите, чтобы класс WutServer наследовал от UnicastRemoteObject;в то время как есть другие способы создания поддержки удаленного взаимодействия, наследование от UnicastRemoteObject, безусловно, является самым простым способом начать работу.

Попробуйте это вместо этого (хотя вам, вероятно, следует отделить удаленный интерфейс в другом файле и получить егоперераспределяется отдельно):

public class WutServer extends UnicastRemoteObject implements WutServer.Wut {
    interface Wut extends Remote {
        String wut() throws RemoteException;
    }
    // Because of the exception...
    public WutServer() throws RemoteException {}
    public String wut() { return "wut"; }
    public static void main(String[] args) throws RemoteException {
        LocateRegistry.createRegistry(1099).rebind("WutManager",new WutServer());
        System.out.println("Ready...");
    }
}
...