Стандартный подход варьируется от системы к системе в зависимости от архитектуры и домена. Как сервер узнает, что клиент не работает? Я думаю, что вам не нужны обратные вызовы, так как вы отправляете уведомления и можете обнаружить, что клиент недоступен. Например:
- отправить уведомление клиенту;
- в случае успеха, перейти к 1;
- иначе удалите все уведомления в очереди для клиента, установите флажок, чтобы не собирать события для клиента.
Когда клиент подключен:
- снять флаг;
- начать отправку уведомлений
Или даже более простой подход:
- стереть очередь уведомлений для клиента при подключении до инициализации диалога;
- запустить поток с низким приоритетом, чтобы стереть все уведомления для всех клиентов старше X, чтобы очистить уведомления для клиента, который никогда не вернется.
Обновление после оригинального комментария автора
Это сильно зависит от того, как все организовано в вашей системе. Предполагая, что:
- Сервер запускает поток (назовем его «агент») для обслуживания клиента, поток для каждого клиента.
- Агент завершает работу, когда клиенты правильно завершают сеанс или отключаются.
- для каждого клиента установлена личная (которая не используется агентами / клиентами) запись
- существует общий список текущих клиентов, который используется другим компонентом (не обычным агентом, назовем его «диспетчер») для распространения записей для клиентов.
решение:
1. сервер запускает агента и регистрирует только что подключенного клиента к списку клиентов. Диспетчер получает уведомление о прибытии нового клиента.
2. агент потребляет записи, пока клиент не подключен. При выключении и / или сбое клиента агенты отменяют регистрацию клиента и очищают набор записей.
Если вещи в вашей системе организованы не так, как описано выше, пожалуйста, предоставьте некоторые подробности.