【问题标题】:RMI Server Stops?RMI 服务器停止?
【发布时间】:2011-07-07 02:59:00
【问题描述】:

如何保持 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();
    }
  }
}

我只是在运行这个课程。我没有运行 rmic 或其他任何东西..

如何强制它继续运行?

【问题讨论】:

    标签: java rmi rmiregistry


    【解决方案1】:

    试试这个:

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

    注意:WutManager 应该实现 java.rmi.Remote。

    【讨论】:

    • 我认为它有效。不再停止了,但是有什么原因需要在导出对象后创建注册表?
    • @verhogen:没有特别的原因;他们是正式独立的。唯一的依赖是注册表和服务器对象都需要存在才能注册另一个。 :-)
    • 也为我工作!谢谢老兄!
    【解决方案2】:

    需要使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...");
        }
    }
    

    【讨论】:

    • 问题中的服务器停止了,因为它实际上没有向注册表注册任何内容;没有远程引用,因此任何剩余的非守护线程都无需执行任何操作,因此进程按照 Java 语言规范退出。
    • 这是 RMI 101,他必须已经完成了所有工作才能走到这一步。与服务器提前退出无关。
    【解决方案3】:

    您的服务器正在被 DGC 处理,然后被 GC 处理,这会导致它无法导出,如果 JVM 无事可做,最终会导致 JVM 退出。为了阻止这种情况,如果您通过LocateRegistry.createRegistry() 创建注册表,请将该方法的返回值保存在静态变量中。否则,请保留对您的服务器对象的静态引用。

    【讨论】:

      【解决方案4】:

      在main函数结束时创建一个对象并调用该对象的wait。那就是;

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

      【讨论】:

        【解决方案5】:

        这是一个老问题,但这是一个新答案。

        在 OSX 上,使用最新的 Java 9.0.4 我发现程序退出了。如果我使用最新的 Java 1.8.0.162,那么它不会退出并且服务器仍在运行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多