我正在尝试实现一个由 RMI 管理的 ID 锁系统。基本上,当客户端输入 ID 时,它会将该 ID 发送到 RMI 服务器,RMI 服务器将其与客户端 ID 和周期计数器一起存储在列表中。
30 秒后,服务器将增加所有周期计数器。除非客户端发送 Unlock 消息,否则客户端将发送 Heartbeat,这会将周期计数器更新回 0。如果周期计数器 >= 3,则服务器将假定客户端已正确断开连接并释放 ID 上的锁定。
我一直在网上进行研究,发现了很多非常具体的方法来做到这一点,但是太多的方法看起来太模糊,或者对于一个项目的需求来说太具体。我想我对如何做到这一点有一个大致的了解,但我想把事情搞清楚:
1 - 大多数实现都会在单独线程的无限循环中发生这种“循环更新”逻辑。它是否正确?看起来我的 RMI 服务器的 Main 类几乎没有发生任何事情,也许我可以在那里实现循环。
2 - 如果该线程确实是正确的方式,那么我什么时候启动该线程?有什么特殊的方法可以实现这一点吗?我在网上查了一下,发现很多网站都说要使用线程,但没有一个网站显示出执行线程的良好示例。
感谢您提供的任何帮助。我对 RMI 还不太了解,所以感谢您的耐心等待。
最佳答案
我认为,您的问题是如何每 30 分钟增加循环计数器,而不是 RMI。
如果是这样,您可以使用 ScheduledExecutorService。
下面有一个伪代码。
public class IdLockMgr {
private Map<String, Integer> idToCycleMap = new HashMap<>();
private ScheduledExecutorService service;
public IdLockMgr() {
service = Executors.newScheduledThreadPool(1);
//BAD
((ScheduledThreadPoolExecutor)service).setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
service.scheduleAtFixedRate(...);//this is point.
}
public void lockId(String id) {
idToCycleMap.put(id, 0);
}
public void shutdown() {
service.shutdown();
}
}
关于Java RMI心跳时间进程循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20619641/