Я попытался внедрить базовую систему уведомлений для базовой социальной сети с p:poll
на уровне представления и простым классом NotificationService
, который получает новые уведомления из БД и обновляет список уведомлений NotificationBean
, который viewcoped для каждого пользователя. Поток процесса аналогичен этому:
-Poll calls NotificationBean.getNewNotifications for example every 15 sec.
--getNewNotifications calls NotificationService and DAO methods
---notificationList of user is refreshed
----DataTable on view layer shows new notifications
Но проблема p:poll
заключается в производительности, потому что он отправляет запрос с каждым истечением интервала.
PrimeFaces имеет PrimePush, который основан на Atmosphere Framework, он открывает веб-сокеты и кажется более подходящим для создания системы уведомлений.
Но я не знаю, какие компоненты и какие их свойства следует использовать. Он имеет компонент p:socket
с свойством channel
. Должен ли я использовать имена пользователей в качестве значений channel
? Ниже код, поступающий из витрины PrimeFaces, и суммирует последние предложения:
<p:socket onMessage="handleMessage" channel="/notifications" />
Насколько я понял из этот пример витрины, этот p:socket
прослушивает канал notifications
. И фрагмент кода толкателя:
PushContext pushContext = PushContextFactory.getDefault().getPushContext();
pushContext.push("/notifications", new FacesMessage(summary, detail));
Но это будет уведомлять все пользовательские страницы, мне нужен толкатель, который уведомляет конкретного пользователя. Скажем, есть 2 пользователя, и предположим, что User1 добавляет User2 в качестве друга. Должно быть, шт. например:
pushContext.push("User2/notifications", new FacesMessage("friendship request", "from User1"));
Но я не уверен, что это правильное использование для такого рода функциональных требований или нет. Учитывая масштабируемость приложения, может быть дорогостоящая стоимость открытия так много каналов в процессе.
Спасибо за помощь.