java - 停止 RMI 服务器的干净方法

标签 java rmi

无需 stopServer 功能即可正常工作的 RMI 服务器。

public class HelloServer extends UnicastRemoteObject implements HelloInterface
{
    private final static int PORT=1102;
    private final String serverName="server"; 
    private Timer timer;

    public HelloServer()  throws RemoteException 
    {
       timer = new Timer();  //At this line a new Thread will be created
       timer.schedule(new StopServerTask(), 5000);

    }

    @Override
    public String serverResponse(String request) throws RemoteException 
    {
    return "Hello"+request;
    }


    public static void main(String[] args)
    {

        try 
        {

            HelloServer skeleton=new HelloServer();
            System.out.println("Starting server");
            skeleton.startServer();
            System.out.println("Server started");


        } 
        catch (RemoteException ex) 
        {
            ex.printStackTrace();
        }


    }

    public void startServer()
    {
  try {

            HelloServer skeleton=new HelloServer();
            Registry reg=LocateRegistry.createRegistry(PORT);
            reg.rebind(serverName, skeleton);
            System.out.println("Server is ready");

        } catch (RemoteException ex) 
        {
            Logger.getLogger(HelloInterface.class.getName()).log(Level.SEVERE, null, ex);
        }    
    }

    public void stopServer()
    {
    System.out.println("Stopping server");
        try {

            Registry rmiRegistry = LocateRegistry.getRegistry(PORT);
            HelloInterface myService = (HelloInterface) rmiRegistry.lookup(serverName);

            rmiRegistry.unbind(serverName);

            UnicastRemoteObject.unexportObject(rmiRegistry, true);

        } catch (NoSuchObjectException e) 
        {
            e.printStackTrace();
        } catch (NotBoundException e) 
        {
            e.printStackTrace();
        } catch (RemoteException ex) {
            Logger.getLogger(HelloServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    class StopServerTask extends TimerTask
        {

        @Override
        public void run() 
        {
        stopServer();
        }

        }
}

每当在调用异常时抛出 stopServer()

UnicastRemoteObject.unexportObject(rmiRegistry, true);

这是堆栈跟踪

java.rmi.NoSuchObjectException: object not exported
    at sun.rmi.transport.ObjectTable.unexportObject(ObjectTable.java:153)
    at java.rmi.server.UnicastRemoteObject.unexportObject(UnicastRemoteObject.java:297)
    at rmi.HelloServer.stopServer(HelloServer.java:84)

即使我使用清理服务对象,情况也是一样的

 UnicastRemoteObject.unexportObject(myService, true);

有人可以建议一种干净的方法来停止服务器,同时释放端口以供重用。

最佳答案

您需要存储 LocateRegistry.createRegistry() 的结果,并取消导出它。目前您正在尝试取消导出 stub 。

关于java - 停止 RMI 服务器的干净方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41334962/

相关文章:

java - Spring RMI错误java.lang.ClassNotFoundException : org. springframework.remoting.rmi.RmiInvocationHandler

java - 更新mongodb java中的嵌套数组列表

java - InApp 计费安全和远程方法调用

java - RMI 有多快?

java - 从java中的复杂JSON中提取特定值

Java RMI - 何时创建 stub 、启动注册表并指定代码库?

java - 在 Java 中,服务器如何更改其 RMI 客户端的线程 ID?

java - 从 TestWatcher 跳过测试

java - org.springframework.orm.jpa.JpaSystemException : null id generated for:class oneToOne

java - 从 PDF 文件中读取条形码