Я разрабатываю приложение с использованием Java RMI, которое позволяет клиентам регистрировать темы, которые они хотят прослушать (ноль или более), и темы (ноль или одна), о которых они хотят говорить. Существует центральный сервер, который предлагает услугу регистрации. Общение клиентов обходится без сервера, за исключением начальной регистрации ListenerCallback или SpeakerCallback.
Клиенты и сервер работают по шаблону Observer.
Интерфейсы обратного вызова:
public interface ListenerCallback extends Remote{
void notify(String topic, String msg) throws RemoteException;
}
public interface SpeakerCallback extends Remote{
Unregister accept(ListenerCallback listenerCallback) throws RemoteException;
}
Фрагмент метода регистрации на сервере, и говорящий, и слушатель являются удаленными ссылками:
for (SpeakerCallback speaker : registeredSpeakers){
try {
speaker.accept(listener);
} catch (RemoteException e){
//TODO should I unregister speaker?
}
}
Как написано выше в // TODO, я полагаю, что мне следует отменить регистрацию оратора в реестрах моих приложений, поскольку, насколько я знаю, RemoteException указывает на разрыв соединения с клиентом.
Проблема, с которой я сталкиваюсь, заключается в том, как мне справиться с ненормальным завершением работы клиента, который только слушает какую-то тему, но ни о чем не говорит. Сервер хранит их в реестрах приложений, но не может определить, действительны ли они по-прежнему, поскольку он не вызывает метод notify ().
Должен ли я добавить в интерфейс ListenerCallback какой-то фиктивный метод только для того, чтобы определить, доступен ли клиент по-прежнему?
Или я должен внедрить протокол, который позволил бы клиентам, которые говорят (метод call notify ()) об определенном сервере тем, уведомлять о том, что некоторые прослушивающие клиенты больше не доступны?