关闭RMI注册表。

3
使用RMI从WebAppA传递String对象到WebAppB。WebAppB是RMIServer,而WebAppA是RMIClient。我在WebAppB中添加了ContextListener,以便在tomcat初始化上下文时立即启动rmi服务。在tomcat的contextDestroyed方法中,我正在尝试使用以下语句关闭/关闭rmi:
unexportObject(remoteObj,true);
LocateRegistry.getRegistry(3232).unbind("MessagePath"); //MessagePath - name of the remote reference

即使执行了上述语句,RMI仍然在端口3232监听传入请求。我通过在命令提示符中使用“netsat -ano”看到了这一点。请帮助我关闭RMI服务。


请查看此答案:如何关闭在特定端口运行的rmiregistry? - canislatrans
3个回答

1

getRegistry仅返回一个存根,因此在unexportObject中使用由createRegistry返回的实例。然而,在我的情况下,这也没有帮助 - 注册表不再处于活动状态,但套接字仍然打开并监听 :-(


0

createRegistry 在尝试关闭注册表时无法工作。

Registry registry = LocateRegistry.createRegistry(3232);

当注册表已经在运行时,这将抛出一个BindException。因此,您无法创建对象以在其中使用它。

UnicastRemoteObject.unexportObject(registry, true);

然而,即使您使用

Registry registry = LocateRegistry.getRegistry(3232);

你只是得到了存根,它不能用作参数来取消导出对象。

我担心的原因是因为我只想在检查注册表尚未启动时才启动它。但我还没有找到方法来做到这一点!


1
先前的 createRegistry()结果 可以被取消导出。为确保其运行,请尝试 createRegistry():如果您收到 BindException,请调用 getRegistry()。当然,您只能在前一种情况下取消导出,但在后一种情况下,它是其他人的注册表,因此他们负责取消导出。 - user207421

-1

我找到了一种关闭注册表的方法,可以从任何进程中进行操作(并且顺便关闭在注册表中绑定的任何进程)。

任何扩展远程接口并最终想要终止的接口也应该扩展以下接口:

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);

您的系统中似乎已经没有了该注册表项。或者,您的问题有其他更为复杂的原因吗?欢迎任何评论。


你打算如何说服RMI注册表实现PIDSupplierInterface并且包含PIDSupplierServer? - user207421

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