Notify nur bestimmte Benutzer über WebSockets, wenn etwas in der Datenbank geändert wird
Um alle Benutzer über WebSockets zu benachrichtigen, wenn in ausgewählten JPA-Entitäten etwas geändert wird, verwende ich den folgenden grundlegenden Ansatz.
@ServerEndpoint("/Push")
public class Push {
private static final Set<Session> sessions = new LinkedHashSet<Session>();
@OnOpen
public void onOpen(Session session) {
sessions.add(session);
}
@OnClose
public void onClose(Session session) {
sessions.remove(session);
}
private static JsonObject createJsonMessage(String message) {
return JsonProvider.provider().createObjectBuilder().add("jsonMessage", message).build();
}
public static void sendAll(String text) {
synchronized (sessions) {
String message = createJsonMessage(text).toString();
for (Session session : sessions) {
if (session.isOpen()) {
session.getAsyncRemote().sendText(message);
}
}
}
}
}
Wenn eine ausgewählte JPA-Entität geändert wird, wird ein entsprechendes CDI-Ereignis ausgelöst, das vom folgenden CDI-Beobachter zu beobachten ist.
@Typed
public final class EventObserver {
private EventObserver() {}
public void onEntityChange(@Observes EntityChangeEvent event) {
Push.sendAll("updateModel");
}
}
Der Beobachter / Verbraucher ruft die statische Methode aufPush#sendAll()
im WebSockets-Endpunkt definiert, der eine JSON-Nachricht als Benachrichtigung an alle zugeordneten Benutzer / Verbindungen sendet.
Die Logik innerhalb dessendAll()
ie @ -Methode muss irgendwie geändert werden, wenn nur ausgewählte Benutzer benachrichtigt werden sollen.
Wenn ein erster Handshake hergestellt wird,HttpSession
uf @ kann wie in @ angegeben zugegriffen werdeDie Antwort, aber es ist immer noch nicht ausreichend, um die oben genannten Aufgaben mit zwei Aufzählungszeichen zu erfüllen. Da es verfügbar ist, wenn die erste Handshake-Anforderung gestellt wird, ist ein Attribut, das für diese Sitzung danach festgelegt wurde, nicht auf dem Server-Endpunkt verfügbar, d. H., Ein Sitzungsattribut, das nach dem Einrichten eines Handshakes festgelegt wurde, ist nicht verfügba
Was ist die akzeptabelste / kanonischste Methode, um nur ausgewählte Benutzer zu benachrichtigen, wie oben erwähnt? Einige bedingte Anweisungen imsendAll()
Methode oder etwas anderes irgendwo ist erforderlich. Es scheint, dass es etwas anderes als nur das @ des Benutzers tun muHttpSession
.
Ich verwende GlassFish Server 4.1 / Java EE 7.