Pushing update events без переполнения клиента. Чистый способ сделать это? - PullRequest
0 голосов
/ 03 апреля 2012

Я думаю, что это решенная проблема, но мой Google-фу не был достаточно хорош.

У меня есть таблица отслеживания состояния нескольких вещей. Сервер может выдавать изменения клиентам по желанию.

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

Какой самый чистый способ достижения этого без создания другого потока менеджера событий?

Мой текущий удар выглядит так:

pushEvent(){
    Look up the last update time
    if: last update less than 5 sec ago
        then do nothing
    else
        pushToClients
}

В большинстве случаев это работает достаточно хорошо, но, очевидно, последнее обновление можно оставить без изменений.

Какой хороший способ сделать это? Несколько способов, о которых я думал:

  1. Добавить 5 секундную задержку ко всем push-сообщениям (например, Thread.sleep), чтобы я мог проверьте, было ли обновление уже запланировано. Не идеально но никто возражал бы
  2. Сделайте push, затем установите doNotPush = true. Используйте таймер для установите его обратно в false.

Спасибо

1 Ответ

0 голосов
/ 03 апреля 2012

На сервере вы можете использовать HashMap, который будет содержать пару {current event, last sent event} в качестве значений и получатели события (клиенты) в качестве ключей. Затем используйте запланированное периодическое задание, которое будет перебирать эту карту, проверьте, если current event != last sent event, и, если да, отправит текущее событие клиенту (и поместите его в last sent).

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

...