2013-12-16 69 views
1

我试图实现由RMI管理的ID锁定系统。非常多的情况是,当客户端输入一个ID时,它会将该ID发送到RMI服务器,RMI服务器将其存储在一个列表中,以及客户端ID和循环计数器。Java RMI心跳时间过程循环

服务器在30秒后将递增所有的周期计数器。除非客户端沿Unlock消息发送消息,否则客户端将沿着Heartbeat发送消息,该消息会将该周期计数器更新回0.如果循环计数器> = 3,则服务器将假定客户端已不正确地断开连接并释放锁定ID。

我一直在网上进行研究,并且发现了很多非常具体的做法,但太多看起来太模糊,或者太针对一个项目的需求。我想我对如何做到这一点有一个大致的想法,但我想直观地看到:

1 -大多数实现都会在独立线程的无限循环中发生这种“循环更新”逻辑。它是否正确?它看起来像我的RMI服务器的主类很少发生,也许我可以在那里实现循环。

2 -如果确实线程是正确的路线,我何时启动线程?有没有什么特别的方法需要完成?我在网上查找并发现许多网站都说使用线程,但没有一个显示他们执行线程的好地方。

感谢您提供的任何帮助。我对RMI仍然很满意,所以我感谢你的耐心。

+0

您应该使用Unreferenced接口作为其中的一部分。它为你做活性检查。 – EJP

+0

我在Unreference接口上阅读。看起来只有在没有更多客户端连接到服务器时才会触发。每当服务器被任何客户端取消引用时,我都会需要它启动。 – UtMan88

回答

1

我认为,您的问题是如何每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(); 
    } 
} 
+0

嗯,我有一些关于如何实现循环计数器的想法,但我甚至不知道'ScheduledExecutorService.'这可能有助于在RMI执行自己的事情时在后台线程上启动进程。现在,至于“何时执行此操作”的问题,在服务器绑定到注册表后,此服务是否应该启动? – UtMan88