问题描述
|
我已经创建了RMI连接,但是当客户端结束或崩溃时,我不知道如何通知服务器。我发现了unreferenced()方法,但是它不起作用。任何想法?
(服务器是多客户端,只有一种对象传递给客户端,但是任何客户端都有不同的实例)。
谢谢。
解决方法
这样做的问题在于,如果客户端崩溃,则很难执行任何操作,最终您将等待超时。
通常的解决方案是设置“心跳”,即定期调用。如果客户的心跳在2个周期后仍未收到,则说明它已经死了。
, unreferenced()方法确实可以工作,但是要花DGC时间间隔才可以。这随JDK版本而异。我上次看那是十分钟。有系统属性可以控制此操作,请参见Java RMI主页。此功能将通过特定于客户端的RemoteSession对象来使用,该对象实现客户端所需的API,跟踪客户端状态,并将Unreferenced作为故障保护实现,以防止客户端无法通过其API保持活动或退出。
除了跟踪客户端上次呼叫您的时间之外,没有其他可靠的方法来检测客户端崩溃,除非您有客户端回调,在这种情况下服务器可以尝试调用客户端。但是,这些通常被视为安全隐患,未经特殊处理,通常无法通过防火墙。