Динамические очереди не создаются при подписке на тему Spring WebSocket с STOMP?
Я разрабатываю push-уведомления для всех пользователей, которые подписались на определенное событие. Пользователь подписывается на тему в RabbitMQ в формате: user-id.event-type.id. Я использую Spring Websocket, Stomp, RabbitMQ и на интерфейсе SockJS и Angular JS. Пользователь должен быть уведомлен обо всех действиях (комментарии и т. Д., Изменение даты) о событии.
Что у нас так далеко:
Сначала я аутентифицируюсь через конечную точку веб-сервиса REST и помещаю свой токен в Cookie. Затем мы подключаемся к веб-сокету. Пользователи подписываются на тему (/topic/user-45.meeting.1235) и получают уведомление. Но моя проблема в том, что некоторые пользователи не получают уведомления. Для второго пользователя по какой-то причине очередь не создается в RabbitMQ. Кто-нибудь знает почему?
Это настройки моего брокера в Spring applicationContext.xml:
<websocket:message-broker application-destination-prefix="/app">
<websocket:stomp-endpoint path="/stomp">
<websocket:sockjs/>
</websocket:stomp-endpoint>
<websocket:stomp-broker-relay relay-host="localhost" relay-port="61613" system-login="guest" system-passcode="guest" prefix="/queue, /topic"/>
</websocket:message-broker>
и вот как подписаться через Sockjs:
var ws = new SockJS('http://' + location.host + path);
var stompClient = Stomp.over(ws);
stompClient.connect({
username: '',
password: '',
host: '/'
}, function () {
stompClient.subscribe('/topic/user-45.meeting.' + obj.id,
function (message) {
console.log(message);
}, {
persistent: true
});
});
ОБНОВЛЕНО
Если мы указываем поле уникального идентификатора в кадре SUBSCRIBE, оно создает уникальную очередь для каждого пользователя. Это путь?
1 ответ
Насколько мне известно, вам нужно подписаться на \queue
не \topic
При этом вам не нужно настраивать имя темы для разных пользователей, что будет обрабатываться sockjs в зависимости от пользователя, вошедшего в систему. А на стороне сервера вы также можете отправлять сообщения определенному пользователю, используя \queue\user\{username}\{name of queue}