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.

Benachrichtigen Sie nur den Benutzer, der für die Änderung der betreffenden Entität verantwortlich ist (dies kann ein Administrator oder ein registrierter Benutzer sein, der nur nach erfolgreicher Anmeldung Änderungen vornehmen kann).Notify nur bestimmte Benutzer (nicht alle). "Spezifisch" bedeutet zum Beispiel, dass beim Abstimmen eines Beitrags auf dieser Website nur der Beitragseigner benachrichtigt wird (der Beitrag kann von jedem anderen Benutzer mit ausreichenden Berechtigungen abgestimmt werden).

Wenn ein erster Handshake hergestellt wird,HttpSessionuf @ 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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage