Я использую GlassFish Server 4.1/Java EE 7. Таким образом, реализация Tyrus WebSocket легко доступна из коробки.
В приложении Java EE есть сценарий, в котором пользователи и администратор совместно выполняют операции CRUD. Операция «вставка» выполняется зарегистрированными пользователями, а остальные операции выполняются администратором по мере необходимости.
Например, отзыв отправляется (таким образом, вставляется через связанный с ним объект JPA Feedback
) зарегистрированными пользователями (только после входа в систему). «Обновление» (в основном только testimonials
) и «удаление» выполняются администратором по мере необходимости (в его собственной сессии).
Следовательно, эти операции выполняются в разных сеансах, требующих разных аутентификаций/авторизаций. Для этого требуются две разные конечные точки WebSockets, например:
@ServerEndpoint("/Admin/Push")
и
@ServerEndpoint("/User/Push")
Вместо использования двух разных классов, таких как
@ServerEndpoint("/Admin/Push") // This is a secured endpoint requiring admin's privileges.
public final class AdminPush {
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);
}
@OnMessage
public void onMessage(String text) {
// Notify all users.
// Since modifications to entities are done on the server side,
// it is basically another synchronized static method notifying all users.
}
}
и
@ServerEndpoint("/User/Push") // This is a secured endpoint requiring user's privileges.
public final class UserPush {
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);
}
@OnMessage
public void onMessage(String text) {
// Notify all users.
// Since modifications to entities are done on the server side,
// it is basically another synchronized static method notifying all users.
}
}
разрешено ли объединять их в один класс, например?
@ServerEndpoint("/Admin/Push")
@ServerEndpoint("/User/Push")
public final class Push {}
Теоретически это всего лишь одна мысль сказать, допустимо ли совмещать их таким воображаемым образом или нет. Практически это, очевидно, ошибка времени компиляции, поскольку @ServerEndpoint
не является повторяемой аннотацией.
В любом из вышеперечисленных случаев пользователи уведомляются, когда что-то изменяется в объектах Feedback
JPA (обновление в реальном времени через WebSockets) либо администратором, либо пользователями. Feedback
общедоступен для всех пользователей, включая анонимных, но может быть представлен только зарегистрированными пользователями (он также периодически обновляется, но это отдельная история).