2015-07-31 4 views
2

Мы используем RabbitMQ + StompJS (w/SockJS & Spring Websocket в качестве промежуточного программного обеспечения, FWIW), чтобы облегчить передачу сообщений через веб-сайты. Все отлично работает, за исключением того, что мы пытаемся StompJS создает очереди как неавтоматическое удаление, то есть мы получаем TONS очередей.stompjs + rabbitmq - создавать очереди автоматического удаления

Мы работаем над этим прямо сейчас с помощью политики, которая очищает неактивные очереди через несколько часов, но мы предпочли бы просто автоматическое удаление очередей, которые завершаются после того, как все клиенты отключится.

Мы попытались установить заголовки auto_delete, auto-delete, autoDelete и любые другие возможные заклинания, которые мы можем найти.

Если мы остановим проверку кадров до их передачи (на минимально возможном уровне в глубине источника StompJS), мы увидим, что эти заголовки присутствуют. Однако они, похоже, не делают это в RabbitMQ (или просто не смотрят на них в команде SUBSCRIPTION?) И создают их как неавтоматическое удаление.

Интересно, что если мы создаем очередь вручную заранее, как автоматическое удаление, регистрация StompJS вызывает ошибку, потому что запрошенный SUBSCRIBE ожидает неавтоматическое удаление. Это говорит о том, что StompJS (или SockJS) явно указывает неавтоматическое удаление, но мы вылили его из источника и исключили.

Итак, вопрос в миллион долларов: как мы можем автоматически удалить очередей с StompJS? Пожалуйста, довольно пожалуйста, и спасибо заранее :)

Пример регистрации

function reg(dest, callback, headers){ 
    stomp.subscribe(dest, callback, headers); 
} 

function cb(payload){ 
    console.log(JSON.parse(payload.body)); 
} 

reg('/queue/foobar', cb, {}); 

детали установки RabbitMQ 3.5.2 и 2.3.3 StompJS

** Примечание ** Если я подписываюсь непосредственно на обмен (с такими местами, как/exchange/foo или/topic/foo), обмен будет определяться как автоматическое удаление. Это только очереди, которые не удаляются автоматически.

+0

Какие реалистичные исполнения вы используете, используя stompjs и sockjs? Я вижу несколько из них через google search. –

+0

@DerickBailey хороший звонок. Добавлена ​​информация –

+0

Вы когда-нибудь исправляли это? Я вижу точно такую ​​же проблему. – ajames

ответ

-1

Я использую StompJS/RabbitMQ в производстве, и я не вижу этой проблемы. Я не могу точно сказать, в чем ваша проблема, но я могу подробно рассказать о своей настройке в надежде, что вы можете обнаружить некоторые различия, которые могут помочь.

  • Я бегу против кролика MQ 3.0.1.
  • Я использую SockJS 0.3.4. Кажется, я вспоминаю некоторые проблемы с использованием более поздней версии от GitHub, но, к сожалению, я не делал заметок, поэтому я не уверен, в чем проблема.
  • Я использую StompJS 2.3.4

По причинам, я не буду вдаваться в здесь - Я отключил в WebSockets транспорта, с помощью белого списка все остальные транспорты.

Вот несколько упрощенный код, показывающий, как подключить:

var socket = new SockJS(config.stompUrl, null, { protocols_whitelist: ['xdr-streaming', 'xhr-streaming', 'iframe-eventsource', 'iframe-htmlfile', 'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 'jsonp-polling'] }); 
var client = Stomp.over(socket); 
client.debug = function() { }; 
client.heartbeat.outgoing = 0; 
client.heartbeat.incoming = 0; 

client.connect(config.rabbitUsername, config.rabbitPassword, function() { 
    onConnected(); 
}, function() { 
    reconnect(d); 
}, '/'); 

И вот как я отключаю:

// close the socket first, otherwise STOMP throws an error on disconnect 
socket.close(); 

client.disconnect(function() { 
    isConnected = false; 
}); 

А вот как я присоединяюсь (это происходит в моей onConnected функции):

client.subscribe('/topic/{routing-key}', function (x) { 
    var message = JSON.parse(x.body); 

    // do stuff with message 
}); 

Моей первой рекомендацией было бы попробовать конкретные версии клиента libs, которые я перечислил. У меня были проблемы с тем, чтобы они играли красиво - и эти версии работают для меня.

+0

Итак, ваш пример работает и будет работать в большинстве случаев, но в моем сценарии мне нужен клиент stomp для непосредственного привязки к очереди (а не обмена). Из того, что я могу сказать, если пункт назначения «/ queue/foo», RabbitMQ определит очередь, но он не является auto_delete (и если он существовал как автоматическое удаление заранее, возникает ошибка) –

+0

Ах - извинения, не оцените это подробности. Ну что ж. –

Смежные вопросы