Уведомлять только определенных пользователей через 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.