我希望服务器在第一次 RMI 调用对服务器进行固定时间后使用回调通知多个客户端。
即服务器将等待固定时间,以便多个客户端可以加入
//server code
void connect (callback) {
thread.sleep(time)
callback.notify()
}
但发生的情况是所有客户端都不会同时收到回调。变化取决于对 server 进行 rmi 调用的时间。如何确保所有客户同时收到通知。
我是 RMI 的新手,正在尝试实现客户端-服务器机制。
你不能。要么你要一个接一个地调用它们,这已经破坏了同时性,或者你并行调用它们,在这种情况下你仍然无法控制线程执行,并且在这两种情况下你也无法控制数据包的发送方式到网络。
这里的问题是需求本身,而不是如何实现它。为什么第一次通话后要有固定时间?你怎么知道所有可能的客户端都在那个固定的时间内连接?为什么客户端都需要同时收到通知?为什么你需要回调?RMI 中的回调通常是设计不佳的标志,出于安全原因,网络管理员对任何类型的回调都抱有极大的怀疑。
对于一般的客户端-服务器机制,您不需要回调。RMI 已经是一种客户端-服务器机制。
请记住,自从我使用 RMI 以来已经有一段时间了,
我同意另一个答案,即这是一个有问题的要求。
但是,如果这个要求是必须的,
我会尝试实现我将要建议的东西,
希望我能正确理解问题是每个服务于 RMI 调用的服务器线程都会调用连接。
我建议以下 -
在 RMI 服务器线程之间实现共享数据结构(即 - 那些运行对“连接”方法的调用的人)。
. 共享数据结构可以是 java.util.Date(或表示毫秒的 Long)到回调列表的并发映射。
connect 的代码将执行以下伪代码:
一个。检查是否有您想要通知回调的日期对象的条目。
如果没有这样的条目,则创建它并放入映射并将“true”设置为 newEntry 标志
b。在列表中添加回调。
C。如果设置了“newEntryFlag”,则使用ScheduledThredPoolExectuor来安排将在到达日期对象的时间时调用的任务。
d。当任务的时间到了——任务的run方法会从共享map中获取回调列表,并为每一个回调调用notify方法。
当然,您需要在这里正确处理同步,我相信您可以做到这一点。