Java - Обнаружение сбоя клиента с RMI - PullRequest
2 голосов
/ 30 мая 2011

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

Ответы [ 2 ]

6 голосов
/ 30 мая 2011

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

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

2 голосов
/ 30 мая 2011

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

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

...