2013-12-16 3 views
1

Я пытаюсь реализовать систему блокировки ID, управляемую RMI. В значительной степени, когда клиент вводит идентификатор, он отправляет этот идентификатор вместе с сервером RMI, который хранит его в списке, вместе с идентификатором клиента и счетчиком циклов.Java RMI Heartbeat цикл процесса

Сервер, через 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