停止 RMI 服务器的干净方法

2023-12-11

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

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(),并取消导出它。目前您正在尝试取消导出存根。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

停止 RMI 服务器的干净方法 的相关文章

随机推荐

  • 从列表中打印随机字符串(多次),不重复

    我想在整个程序中多次打印同一列表中的随机字符串 但不重复任何先前打印的随机字符串 如果我有以下内容 core a b c d print random sample core 0 k 2 print random sample core 0
  • 如何使用列表中的元素构建特定形状的树

    给定一个 s 表达式 a b c d 和一个清单 e f g h 如何遍历 s 表达式创建具有相同形状但元素取自列表的 s 表达式 例如 对于上面的 s 表达式和列表 结果将是 e f g h 按从左到右的顺序遍历树对并不是特别困难 因为c
  • 获取任意给定数量的包含字符串的数组的交集元素的函数

    我有以下函数返回一些字符串数组之间的元素的交集 最初它只打算处理 2 个数组 但我开始需要它处理 2 个以上的数组 所以我添加了条件return使其递归 我怎样才能让它足够灵活 以便它能够处理任意数量的数组 当然等于或大于 2 我想过使用
  • 使用 Qt 运行日志流处理程序时 Python 崩溃

    Goal 我有一个在运行时记录文件 realtime log 的进程 我想在我的应用程序中实时打印该文件的每个新行 换句话说 我想将进程的输出重定向到 GUI 这意味着我有两个不同的过程运行 引擎 和GUI 我已经通过使用 Tkinter
  • 在 reStructuredText 中格式化链接中的文本

    如何格式化 reStructuredText 中指定链接内的文本 具体来说 我希望从我的第一个代码生成以下 HTML a href http docs python org library optparse html a
  • 无法在 Heroku 上启用 user-env-compile

    这是我第一次提出要求 如果我不够精确 请见谅 我尝试使用启用 user env compile 来管理我的密钥来在 heroku 上上传我的 Rails 应用程序 但出现错误 没有此类功能 user env compile 我检查了 Her
  • 如何在 Struts 2 中使用 XML 配置验证特定操作

    我只想在操作类中验证特定方法 行动方法是这样的 public String add throws Exception aflag true org setAoName aoName orgBo addOrg org orglist orgB
  • 从 ClassMap 中查找主键

    With Fluent NHibernate 我有一个任意的ClassMap
  • 在 HashMap 中使用复杂键时如何避免临时分配?

    我正在使用复杂的密钥HashMap这样密钥包括两部分 其中一部分是String 我不知道如何通过HashMap get方法无需分配新的String对于每个查找 这是一些代码 derive Debug Eq Hash PartialEq st
  • libgdx touchDown 仅调用一次

    我是 LibGdx 的新手 在输入处理方面遇到问题 我的玩家需要在触摸按下时射击子弹 但这个方法似乎只被调用一次 然后用户必须再次单击才能发射另一颗子弹 我总是想在点击按下时射击子弹 有没有办法处理这个用例 调查对触摸输入进行 轮询 而不是
  • 由于 XCode 更新到版本 6,无法启动 QtCreator 调试器

    Xcode 将自身更新到版本 6 现在我无法在调试模式下启动 QtCreator 有谁知道如何解决这个问题 这是一个Qt Creator 中的已知错误 解决方法很简单 在 窗口 gt 视图 中 显示调试器命令日志 然后启动调试会话 稍等一下
  • JavaScript 中的面向对象编程

    我想知道在 Javascript 中使用 OOP 的最佳方式是哪种 有这个原型的东西 你就有了函数风格的方式 但两者继承基类的方法都很糟糕 所以我尝试建立一种方法来实现这一点 而不必使用原型等 function Car name this
  • Mongo 子字段查询

    我有一份文件 id ObjectId 51385d2308d427ce306f0100 aid 1 studyId study 1 mediaType microBlog text bla bla sentences bla bla sta
  • 如何使用 SQL 计算月度保留率

    尝试获得一个基本表格 显示从一个月到下个月的保留情况 因此 如果有人上个月买了东西 下个月又买了 那么就会被计算在内 month num transactions repeat transactions retention 2012 02
  • HTML 到 PDF 动态添加目录 (TOC)

    我正在使用 iText 7 将 html 转换为 PDF 但我什至找不到一个有关如何将目录添加到最终 PDF 的示例 按照 iText 示例 将文本转换为 PDF 并添加目录是一项简单的任务here 但显然在将 HTML 转换为 PDF 时
  • AngularJS HTTP post 到 PHP 且未定义

    我有一个带有标签的表格ng submit login 该函数在 javascript 中被调用得很好 function LoginForm scope http http defaults headers post Content Type
  • 如何用 sed 删除尾随空格?

    我有一个简单的 shell 脚本 可以从文件中删除尾随空格 有什么方法可以使这个脚本更加紧凑 无需创建临时文件 sed s t 1 gt 1 tmp cat 1 tmp gt 1 rm 1 tmp 您可以使用就地选项 i of sed对于
  • 执行 $.getJSON 后对 JSON 数组进行排序

    我的 json 对象和 getJSON 之间有工作连接 我还可以使用此代码对一次获得的数据进行排序 我在数组的 名称 字段上对它进行排序 它工作正常 getJSON url function json function sortJson a
  • 如何在istio中配置入口网关?

    我是 istio 的新手 我想通过 istio ingress gateway 访问我的应用程序 但我不知道为什么它不起作用 这是我的kubenetes deploy yaml文件内容 apiVersion v1 kind Service
  • 停止 RMI 服务器的干净方法

    RMI 服务器无需 stopServer 功能即可正常工作 public class HelloServer extends UnicastRemoteObject implements HelloInterface private fin