从第一次RMI调用到服务器的固定时间后通知所有客户端

时间:2012-10-02 06:38:57

标签: java rmi

我希望服务器在从服务器的第一次RMI调用开始的固定时间后使用回调通知多个客户端。

即服务器将等待固定时间,以便多个客户端可以加入

//server code
void connect (callback) {

thread.sleep(time)
callback.notify()

}

但是会发生的是所有客户端都没有同时收到回调。变化取决于对服务器进行rmi调用的时间。 怎么办我确保所有客户同时收到通知。

我是RMI的新手并试图实现客户端 - 服务器机制。

2 个答案:

答案 0 :(得分:1)

你做不到。您要么逐个调用它们,它们已经同时失败,或者您并行调用它们,在这种情况下,您仍无法控制线程执行,在这两种情况下,您也无法控制数据包的发送方式到网络。

这里的问题是需求本身,而不是如何实现它。为什么第一次通话后会有固定的时间?您如何知道在固定时间内所有可能的客户端都已连接?为什么客户都需要同时获得通知?为什么你需要回调? RMI中的回调通常表明设计不佳,出于安全原因,网络管理员会极其怀疑任何类型的回调。

您不需要针对常规客户端 - 服务器机制的回调。 RMI已经是一个客户端 - 服务器机制。

答案 1 :(得分:0)

请记住,自从我使用RMI以来已经有一段时间了 我同意另一个答案,说这是一个有问题的要求。
但是,如果这个要求是必须的,我会尝试实现我即将建议的东西,希望我能正确理解问题是每个服务于RMI的服务器线程都会调用connect呼叫。
我建议如下 -
在RMI服务器线程之间实现共享数据结构(即,运行“connect”方法调用的那些线程)。
。 共享数据结构可以是java.util.Date(或Long表示毫秒)的并发映射到回调列表。
connect的代码将执行以下伪代码:

一个。检查是否有要通知回调的日期对象的条目。
如果没有这样的条目,创建它并放入地图并将“true”设置为newEntry标志
湾在列表中添加回调。
C。如果设置了“newEntryFlag”,则使用ScheduledThredPoolExectuor来安排在达到日期对象时调用的任务。
d。当任务的时间到达时 - 任务的run方法将从共享映射中获取回调列表,并且每个回调都会调用notify方法。

当然,你需要在这里正确处理同步,我相信你可以管理它。