我正在研究Java RMI。 我在端口2028上运行我的rmiregistry时遇到了一些小问题,因为我已经使用它来运行我的testing程序。 我可以使用其他端口来运行我的程序,但我想知道,我们如何closures在端口上运行的rmiregistry?
如果你想在编程中做到这一点,我们做的事情如下:
// 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类的完整代码 。 我们在创建其中的2个时遇到问题,并且完全取消注册,所以我们确保在不同的端口上运行我们的单元测试。
我在我的SimpleJmx JMX客户端/服务包中使用这个代码。
经过这么多的麻烦,我突然意识到rmiregistry运行在shell的背景下。 所以我们必须先关闭它,然后把它放到前台,然后关闭它。 它的工作。
顺便把它带到前台只是键入:
% fg
然后关闭它类型:
Ctrl + c
而已。 非常感谢所有试图帮助我的人。
如果从shell运行rmiregistry,请尝试关闭它:
Process p = Runtime.getRuntime().exec("ps -ef | grep rmiregistry | awk '{ print $2 }' | kill -9");
我对shell命令并不是很新鲜,但是我希望你明白。
如果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); }