Сервер RMI останавливается?

Как мне сохранить работоспособность сервера 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 ответов

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

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

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

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

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

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

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

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();          
     } 
}

Вам нужно сделать 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...");
    }
}
Другие вопросы по тегам