当前位置: 首页 > 面试题库 >

干净的方法来停止RMI服务器

阴宏爽
2023-03-14
问题内容

一个没有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(),并取消导出结果。目前,您正在尝试取消导出存根。



 类似资料:
  • 我终于在我的程序中实现了Thread.interrupt()而不是Thread.stop()。然而,我不确定我做得好不好。 我有一个类,它扩展了Thread并声明了几个方法。每个方法都抛出InterruptedException(每个方法都执行I/O密集型操作,其中一些需要几分钟才能完成,因此我没有使用线程安全标志,因为该标志直到操作完成后才会被检查)。我还在这些方法的几个地方添加了以下代码来抛出

  • 问题内容: 我最近一直在尝试使用logback,并且一直在Eclipse内部直接运行示例。当我这样做时,我注意到- 即使在我的静态方法结束之后(从Java驱动程序类内部),应用程序仍在运行。 最终,我确定Logback正在管理自己的线程,这些线程即使在我的主应用程序退出后仍保持活动状态。我四处搜寻一些解决方案,发现这是从Java内部显式关闭Logback的一种方式: 这真的是彻底关闭登录的唯一方法

  • 我有一些简单的枚举名:失败/成功的结果 我有一个函数,它什么也没有得到,但返回未来的结果, 我不喜欢我的解决方案,它看起来很凌乱,有更简单的吗? 返回 我想在这里做的是,如果返回None,那么func应该返回Future[Fail],否则调用db,这也返回一个case类的未来,并基于响应返回Fail/Success。 但我正在寻找一种超级时尚的斯卡拉方式,让它看起来不错:) 谢谢

  • 问题内容: 我正在尝试从WCF服务返回一些JSON。该服务仅从我的数据库返回一些内容。我可以得到数据。但是,我担心JSON的格式。当前,返回的JSON格式如下: 实际上,我希望JSON的格式尽可能整洁。我相信(我可能是不正确的),以干净的JSON表示的相同结果集应如下所示: 我不知道“ d”来自哪里。我也不知道为什么要插入转义字符。我的实体如下所示: 负责返回内容的服务定义为: 如何从WCF服务返

  • 问题内容: 我已经到了秃顶几步之遥… 我正在尝试运行一项服务,该服务将检查我工作中的服务器是否正在运行。应该每5分钟执行一次。 我经历过TimerTask,ScheduledExecutorService,最后是Handler。他们都工作了好几个小时,除了一些不准确的地方外,还有1-5分钟的时间,然后突然,“计时器”就停止了发射。 现在,我已经了解到,如果Scheduler遇到未捕获的异常,它将停

  • 问题内容: 顾名思义,是否有适当的方法来设置一些初始CSS属性(或类),并告诉浏览器将其转换为另一个值? 这不会激活Chrome 29 / Firefox 23中元素的不透明度。这是因为(源): […]您会发现,如果同时应用两组属性,则立即应用一组属性,然后浏览器将尝试优化属性更改,而忽略您的初始属性并防止过渡。在幕后,浏览器在绘画之前先批处理属性更改,这通常会加快渲染速度,但有时可能会产生不利影