Ich habe versucht, das grundlegende Benachrichtigungssystem für ein einfaches soziales Netzwerk mit p:poll
auf der Ansichtsebene und eine einfache NotificationService
Klasse, die die neuen Benachrichtigungen aus der DB abruft und die Liste der Benachrichtigungen von NotificationBean
die für jeden Benutzer aufgeschlüsselt ist. Prozessablauf ähnlich wie hier:
-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
Aber die Sorge der p:poll
ist die Leistung des Systems, da es bei jedem Ablauf des Intervalls eine Abfrage sendet.
PrimeFaces hat PrimePush das auf Atmosphere Framework basiert, öffnet Web-Sockets und scheint für die Erstellung von Benachrichtigungssystemen besser geeignet zu sein.
Aber ich weiß nicht, welche Komponenten und welche Eigenschaften von ihnen verwendet werden sollen. Es hat p:socket
Komponente mit channel
Eigentum. Sollte ich Benutzernamen als channel
Werte? Der nachfolgende Code stammt aus PrimeFaces und fasst die letzten Sätze zusammen:
<p:socket onMessage="handleMessage" channel="/notifications" />
Soweit ich das aus dieses Vorzeigebeispiel este p:socket
hört zu notifications
Kanal. Und Pusher-Code-Schnipsel ist:
PushContext pushContext = PushContextFactory.getDefault().getPushContext();
pushContext.push("/notifications", new FacesMessage(summary, detail));
Aber dies wird alle Benutzerseiten benachrichtigen, ich brauche einen Pusher, der bestimmte Benutzer benachrichtigt. Sagen wir, es gibt 2 Benutzer und nehmen wir an, dass Benutzer1 Benutzer2 als Freund hinzufügt. So etwas muss es doch geben:
pushContext.push("User2/notifications", new FacesMessage("friendship request", "from User1"));
Ich bin mir aber nicht sicher, ob dies die richtige Verwendung für diese Art von funktionalen Anforderungen ist. In Anbetracht der Skalierbarkeit der App kann es teuer werden, so viele Kanäle pro Prozess zu öffnen.
Danke für die Hilfe.