Уведомлять только определенных пользователей через WebSockets, когда что-то изменяется в базе данных

Чтобы уведомлять всех пользователей через WebSockets, когда что-то изменяется в выбранных объектах JPA, я использую следующий базовый подход.

@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);
                }
            }
        }
    }
}

Когда выбранный объект JPA изменяется, возникает соответствующее событие CDI, которое должен наблюдать следующий наблюдатель CDI.

@Typed
public final class EventObserver {

    private EventObserver() {}

    public void onEntityChange(@Observes EntityChangeEvent event) {
        Push.sendAll("updateModel");
    }
}

Наблюдатель / потребитель вызывает статический методPush#sendAll() определяется в конечной точке WebSockets, которая отправляет сообщение JSON в качестве уведомления всем связанным пользователям / соединениям.

Логика внутриsendAll() метод должен быть как-то изменен, когда только выбранные пользователи должны быть уведомлены.

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

Когда начальное рукопожатие установлено,HttpSession можно получить доступ, как указано вэтот ответ, но этого недостаточно для выполнения задач, упомянутых выше двумя пунктами. Так как он доступен, когда сделан первый запрос квитирования, любой атрибут, установленный для этого сеанса впоследствии, не будет доступен в конечной точке сервера, то есть, другими словами, любой атрибут сеанса, установленный после установления квитирования, будет недоступен.

Каков наиболее приемлемый / канонический способ уведомления только избранных пользователей, как указано выше? Некоторые условные утверждения вsendAll() метод или что-то еще где-то требуется. Похоже, что он должен делать что-то, кроме только пользователяHttpSession.

Я использую GlassFish Server 4.1 / Java EE 7.

Ответы на вопрос(1)

Ваш ответ на вопрос