Java EE: разумно ли в этом сценарии сделать мой атрибут контекста поточно-ориентированным? - PullRequest
0 голосов
/ 07 мая 2011

Я внедряю динамическую систему уведомлений (а-ля Facebook) для моего сайта с помощью API Servlet 3.0. Моя запланированная структура для поддержки этой функциональности:

  1. При каждой загрузке страницы отправляйте XMLHTTP «get» запрос к серверу
  2. Разрешить серверу создавать объекты AsyncContext из этих запросов "получить" и хранить их в карте приложения по идентификатору сайта пользователя
  3. Всякий раз, когда пользователь участвует в действии что порождает уведомление, запросить карта области применения для идентификаторов друзей пользователя, и используя AsyncContext объекты хранятся там, отправьте уведомление каждому другу.
  4. Каждый из друзей получает извещение.

Мой вопрос: необходимо ли сделать эту карту безопасной для потоков? В худшем случае функция, действующая от имени «отправляющего уведомления пользователя», отправит уведомление в устаревший асинхронный контекст на карте, либо потому, что пользователь соответствует ему, в данный момент переключает страницы и еще не отправить новый запрос XMLHTTP или вышел из системы.

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

Учитывая эту информацию, существуют ли сценарии, которые требуют, чтобы карта была поточно-ориентированной?

1 Ответ

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

Вам может не потребоваться точная согласованность ... но вы все равно не хотите, чтобы ЛЮБЫЕ потоки читали обычную хэш-карту во время ее записи (добавление может вызвать перефразировку и поместить получающий поток в бесконечный цикл).

Кроме того, этот план не будет очень хорошо масштабироваться после 1 сервера.Если это нормально .... просто используйте ConcurrentHashMap.

...