unexportObject(remoteObj,true);
LocateRegistry.getRegistry(3232).unbind("MessagePath"); //MessagePath - name of the remote reference
即使执行了上述语句,RMI仍然在端口3232监听传入请求。我通过在命令提示符中使用“netsat -ano”看到了这一点。请帮助我关闭RMI服务。
unexportObject(remoteObj,true);
LocateRegistry.getRegistry(3232).unbind("MessagePath"); //MessagePath - name of the remote reference
即使执行了上述语句,RMI仍然在端口3232监听传入请求。我通过在命令提示符中使用“netsat -ano”看到了这一点。请帮助我关闭RMI服务。
getRegistry仅返回一个存根,因此在unexportObject中使用由createRegistry返回的实例。然而,在我的情况下,这也没有帮助 - 注册表不再处于活动状态,但套接字仍然打开并监听 :-(
createRegistry
在尝试关闭注册表时无法工作。
Registry registry = LocateRegistry.createRegistry(3232);
当注册表已经在运行时,这将抛出一个BindException
。因此,您无法创建对象以在其中使用它。
UnicastRemoteObject.unexportObject(registry, true);
然而,即使您使用
Registry registry = LocateRegistry.getRegistry(3232);
你只是得到了存根,它不能用作参数来取消导出对象。
我担心的原因是因为我只想在检查注册表尚未启动时才启动它。但我还没有找到方法来做到这一点!
createRegistry()
的 结果 可以被取消导出。为确保其运行,请尝试 createRegistry()
:如果您收到 BindException
,请调用 getRegistry()
。当然,您只能在前一种情况下取消导出,但在后一种情况下,它是其他人的注册表,因此他们负责取消导出。 - user207421我找到了一种关闭注册表的方法,可以从任何进程中进行操作(并且顺便关闭在注册表中绑定的任何进程)。
任何扩展远程接口并最终想要终止的接口也应该扩展以下接口:
public interface PIDSupplierInterface extends Remote {
String getPID() throws RemoteException;
}
每个使用此作为接口一部分创建的服务器类都必须实现getPID()。你需要做的是返回进程ID。在Windows上,可以搜索“getpids”,或者访问这里:www.jroller.com/santhosh/entry/get_current_java_process_id。对于Linux而言,获取PID更加直接。然后(在Windows上),你需要执行以下操作:
String PID = myServer.getPID();
String[] a_command = { "taskkill", "/pid", PID };
Runtime.getRuntime().exec(a_command, envp, dir);
要消除注册表本身的PID,首先在启动注册表时(以编程方式),只需要执行以下操作
PIDSupplierInterface stub = PIDSupplierInterface)UnicastRemoteObject.exportObject(
new PIDSupplierServer(), 0);
reg.bind( "regKiller", stub );
PIDSupplierServer是一个仅实现PIDSupplierInterface接口的类。
然后,当您想要从任何进程中终止RMI注册表时,只需执行以下操作
PIDSupplierInterface regProcess = (PIDSupplierInterface)reg.lookup( "regKiller" );
String regPID = regProcess.getPID();
String[] a_command = { "taskkill", "/pid", regPID };
Runtime.getRuntime().exec(a_command, envp, dir);
您的系统中似乎已经没有了该注册表项。或者,您的问题有其他更为复杂的原因吗?欢迎任何评论。
PIDSupplierInterface
并且包含PIDSupplierServer
пјџ - user207421