2013-12-16 45 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