Динамические очереди не создаются при подписке на тему Spring WebSocket с помощью STOMP?

Я разрабатываю push-уведомление для всех пользователей, которые подписались на конкретное событие. Пользователь подписывается на тему в RabbitMQ в формате: user-id.event-type.id. Я использую Spring Websocket, Stomp, RabbitMQ, а также на интерфейсных SockJS и Angular JS. Пользователь должен быть уведомлен обо всех действиях (комментарии и т. Д., Изменении даты) по поводу события.

Что у нас есть на данный момент:

Сначала я проверяю подлинность через конечную точку веб-службы REST и помещаю свой токен в Cookie. Затем подключаемся к websocket. Пользователи подписываются на тему (/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
        });
});

ОБНОВЛЕНО

Если мы укажем уникальное поле Id во фрейме SUBSCRIBE, оно создаст уникальную очередь для каждого пользователя. Это путь?


person Abzal Kalimbetov    schedule 14.01.2015    source источник
comment
Нет. Разная машина.   -  person Abzal Kalimbetov    schedule 14.01.2015
comment
Можете ли вы воспроизвести ошибку «очередь не создана» с помощью клиента Java (не Websocket)?   -  person mjn    schedule 15.01.2015


Ответы (1)


Насколько мне известно, вам необходимо подписаться на \queue, а не \topic. При этом вам не нужно настраивать имя темы для разных пользователей, которые будут обрабатываться sockjs в зависимости от зарегистрированного пользователя. А на стороне сервера вы также можете отправлять сообщения на конкретный пользователь, используя \queue\user\{username}\{name of queue}

person MasterCode    schedule 05.11.2015