документация для Spring WebSockets гласит:
4.4.13. Пользовательские направления
Приложение может отправлять сообщения, предназначенные для определенного пользователя, а поддержка STOMP в Spring для этой цели распознает места назначения с префиксом «/ user /». Например, клиент может подписаться на адрес назначения «/ user / queue / position-updates». Этот пункт назначения будет обрабатываться UserDestinationMessageHandler и преобразован в пункт назначения, уникальный для пользовательского сеанса, например "/ очередь / позиция-обновления-пользователь123". Это обеспечивает удобство подписки на одно и то же место назначения, в то же время гарантируя отсутствие конфликтов с другими пользователями, подписывающимися на то же место назначения, так что каждый пользователь может получать уникальные обновления позиции запасов.
Это должно работать в многосерверной среде с RabbitMQ в качестве брокера?
Насколько я могу судить, имя очереди для пользователя создается путем добавления simpSessionId
. При использовании рекомендованной клиентской библиотеки stomp.js это приводит к тому, что первый пользователь получает имя очереди "/queue/position-updates-user0"
, следующий получит "/queue/position-updates-user1"
и так далее. Это, в свою очередь, означает, что первые пользователи, подключившиеся к разным серверам, подпишутся на одну и ту же очередь ("/queue/position-updates-user0"
).
Единственная ссылка на это, которую я могу найти в документации, такова:
В сценарии с несколькими серверами приложений пользовательский пункт назначения может оставаться нерешенным, поскольку пользователь подключен к другому серверу. В таких случаях вы можете настроить место назначения для широковещательной рассылки неразрешенных сообщений, чтобы другие серверы могли попробовать. Это можно сделать с помощью свойства userDestinationBroadcast объекта MessageBrokerRegistry в конфигурации Java и атрибута user-destination-broadcast элемента брокера сообщений в XML.
Но это только позволяет общаться с пользователем с другого сервера, чем тот, на котором установлен веб-сокет.
Я чувствую, что что-то упускаю? Есть ли способ настроить Spring для безопасного использования MessagingTemplate.convertAndSendToUser(principal.getName(), destination, payload)
в многосерверной среде?