Я пытаюсь создать чат-приложение, используя Spring WebSocket и Stomp.
Я использую Spring 4.1.1, Stomp.js, ActiveMQ 5.9.
Этот пользователь может отправлять сообщения каждому из своих друзей, которые также вошли в систему, войдя в приложение. Для отправки сообщения конкретному пользователю я делаю следующие шаги:
1) Пользователь регистрируется в
2) Пользователь подписывается на пункт назначения «/ user / queue / messaging».
Это будет использоваться для отправки личных сообщений пользователей друг к другу.
3) когда пользователь хочет отправить сообщение, он отправляет его по назначению:
/ user / {user_id} / queue / messaging, где user_id - это идентификатор пользователя получателя.
Я пытаюсь отправить это от клиента, использующего метод отправки STOMP.js.
4) Ожидаемое поведение: теперь, если получатель вошел в систему и его идентификатор сеанса, например, DFT0GH, то сообщение на шаге e должно быть доставлено в место назначения очереди с именем сообщения- userDFT0GH. Вместо этого он доставляется в очередь того же пользователя, который его отправил.
Пожалуйста, найдите мой пример сценария:
1) Пользователь Джон входит в систему. Он подписывается на / user / queue / messaging
Его идентификатор пользователя - john.
Его идентификатор сеанса - ABCD01.
Очередь создается с именем на брокере activemq в качестве сообщения - userABCD01
2) Пользователь Алиса входит в систему.
Она подписывается на / user / queue / messaging.
Его идентификатор пользователя - alice.
3) пользователь Джон отправляет сообщение через метод отправки STOMP.js Алисе, используя пункт назначения как «/ user / alice / queue / messaging»
4) теперь вместо доставки сообщения в очередь обмена сообщениями - UserXYZ01, оно доставляется в место назначения очереди Джона, то есть сообщение - userABCD01. Почему это так?
Когда я отладил это, я обнаружил следующую строку в методе private DestinationInfo parseUserDestination (сообщение сообщения) класса DefaultUserDestinationResolver:
if (SimpMessageType.MESSAGE.equals(messageType)) {
........
sessionIds = (sessionId != null ?
Collections.singleton(sessionId) : this.userSessionRegistry.getSessionIds(user));
}
В этом sessionId регистрируется идентификатор сеанса пользователя (принципала), который не равен нулю, поскольку пользователь вошел в систему, и поэтому его sessionIds возвращаются, и сообщение доставляется в его очередь, даже если предполагаемый пользователь-получатель отличается.
Когда я проверяю sessionIds usersessionregistry collection Я нахожу запись [alice]: XYZ01.
Не следует ли выше строки возвращать идентификатор сеанса, если пользователь вместо входа в сеанс пользователя для определения очереди назначения.?
Извините, я пробую это впервые. Поэтому, пожалуйста, дайте мне знать, если я что-то пропущу здесь и есть ли
1) какой-либо способ удовлетворить мой вариант использования
2) или сам мой вариант использования недействителен.
Заранее спасибо.