如何在使用进程内Java RMI注册表时很好地关闭

时间:2016-02-20 15:27:23

标签: java server client rmi distributed

案例

我在服务器进程中使用进程内* Java RMI注册表。

我在注册表中绑定了一个对象。

我的客户端进程连接并查找绑定,并传递远程对象。

现在我希望服务器进程干净地关闭,即不再存在deamon-threads。使用RMI,我在服务器进程中的一个对象上调用“close”,问题是这个“关闭”方法实际上必须做什么。

问题

如何确保在使用RMI导出对象的进程中没有运行非守护程序线程?

据我所知,我必须取消导出** JVM关闭的所有导出对象?由于许多对象已经通过RMI传递,我将不得不维护这些对象的集合和每个对象的展开。

我已经读过,任何导出的对象都应该在垃圾收集器(现在找不到引用)时自动导出,但是我的经验告诉我,某些对象(特别是distrubuted?)可能需要很长时间才能被垃圾收集所以这不是一个真正的选择。

*使用LocateRegistry创建 **使用UnicastRemoteObject

执行Unexport

1 个答案:

答案 0 :(得分:0)

  

如何确保在使用RMI导出对象的进程中没有运行非守护程序线程?

全部取消导出,包括注册表。请注意,这需要保存createRegistry().

的返回值
  

据我所知,我必须取消导出** JVM关闭的所有导出对象?由于许多对象已经通过RMI传递,我将不得不维护这些对象的集合和每个对象的展开。

正确,除非您使用Unreferenced设施。

  

我已经读过,任何导出的对象都应该在收集垃圾时自动取消(现在找不到引用)但是我的经验告诉我,某些对象(尤其是分布式的?)可能需要很长时间才能被垃圾收集所以这不是一个真正的选择。

您可以控制所有DGC超时。它确实是一个选项,通过Unreferenced界面。