2011-05-30 2 views
2

Я создал соединение RMI, но не знаю, как уведомить сервер о завершении или сбое клиента. Я нашел метод unreferenced(), но он не работает. Есть идеи?
(сервер многоклиентен, только один объект передается клиенту, но у любого клиента есть другой экземпляр).
Спасибо.Java - Обнаружение сбоя клиента с RMI

ответ

6

Проблема в том, что если клиент терпит крах, трудно заставить его что-либо сделать, и вы в конечном итоге ожидаете таймаутов.

Обычное решение - установить «сердцебиение», периодический вызов; если сердцебиение клиента не доходит до вас, скажем, 2 периода, вы считаете, что он мертв.

+0

Спасибо за ваш ответ. Этот механизм был моим последним выбором, так как я надеялся, что есть лучшая альтернатива. В любом случае, как сервер может вызвать клиента? Сервер, к настоящему времени, использует только: \t \t \t LocateRegistry.createRegistry (RMI_PORT); Naming.rebind (...); Есть ли способ «ping» клиента? Еще раз спасибо :) – Simon

2

Метод unreferenced() действительно работает, но он занимает интервал времени DGC, прежде чем он это сделает. Это зависит от версии JDK. В прошлый раз я посмотрел, что прошло десять минут. Для управления этим свойством являются свойства системы, см. Домашнюю страницу Java RMI. Этот объект будет использоваться через объект RemoteSession, специфичный для клиента, который реализует API, который нужен клиенту, отслеживает состояние клиента и реализует Unreferenced как отказоустойчивый клиент, неспособный сохранить себя в живых или выйти из своего API.

Нет другого надежного способа обнаружения сбоя клиента, кроме отслеживания, когда вы последний раз вызывали вас, если у вас нет обратных вызовов на стороне клиента, и в этом случае сервер может попробовать позвонить клиенту. Однако они широко рассматриваются как риск для безопасности и, как правило, не работают через брандмауэры без специального обращения.

Смежные вопросы