如何关闭在特定端口运行的rmiregistry?

8

我正在处理Java RMI。我在运行rmiregistry时遇到了一些问题,因为我已经使用端口2028来运行我的测试程序。我可以使用其他端口运行程序,但我想知道如何关闭特定端口上正在运行的rmiregistry?


你是以编程方式还是手动方式作为单独进程启动rmiregistry程序? - Tudor
不,我是在Linux shell中像以下这样启动它的:% rmiregistry 2028& - slonkar
如果你手动启动它,难道也不能手动停止吗? - Tudor
我找不到相应的命令,所以才在这里提出了这个问题... - slonkar
4个回答

11
经过一番麻烦的尝试,我突然意识到rmiregistry在shell的后台运行。因此,我们需要先将其切换到前台,然后关闭它。这样就可以顺利解决问题了。
顺便说一下,要将其切换到前台,只需输入以下命令:
% fg

然后要关闭它,输入:

Ctrl + c

就这样。非常感谢所有试图帮助我的人。


11

如果你想在编程中实现这个,我们可以这样做:

// create the registry
Registry rmiRegistry = LocateRegistry.createRegistry(port);
...
// connect to it
JMXConnectorServer connector =
    JMXConnectorServerFactory.newJMXConnectorServer(url,
        new HashMap<String, Object>(),
        ManagementFactory.getPlatformMBeanServer());
// do stuff with it ...

// close the connection
if (connector != null) {
    connector.stop();
}
// deregister the registry
if (rmiRegistry != null) {
    UnicastRemoteObject.unexportObject(rmiRegistry, true);
}

这是我们的JMXServer类的完整代码链接。我们有两个问题:创建两个实例和完全取消注册它们,所以我们确保在不同的端口上运行单元测试。

我在我的SimpleJmx JMX客户机/服务包中使用此代码。


我正在从 shell 启动 rmiregistry。不通过程序使用它。 - slonkar
1
我在使用Eclipse时遇到了类似的问题,其中注册表线程会一直继续运行,而上面的代码片段无法停止。将System.exit(0)添加到结尾处,它将终止JVM中的所有线程,然后一切都结束了;-) - Chuck Mosher
+1 我停止了连接器,但无法弄清楚如何摆脱注册表的服务器套接字。感谢您的答案。 - dannrob

1

如果您正在从shell运行rmiregistry,请尝试使用以下命令关闭它:

Process p = 
Runtime.getRuntime().exec("ps -ef | grep rmiregistry | awk '{ print $2 }' | kill -9");

我对shell命令不是很熟悉,但我希望你能理解我的意思。


我猜从shell中我将不得不使用ps -ef | grep rmiregistry。我还没有尝试过。但我一定会让你知道的。谢谢。 - slonkar
@ Tudor:抱歉,兄弟,它没有起作用……但我找到了解决方法。 - slonkar

1
如果rmi注册表已经使用该端口,而您想要重新绑定服务而不使用另一个端口。您可以尝试以下代码。
Registry registry = null;
try {
    registry = LocateRegistry.createRegistry(1099);
} catch (ExportException ex) {
   registry = LocateRegistry.getRegistry(1099);
} catch (RemoteException ex) {
  Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接