Stompjs + rabbitmq - создавать очереди автоудаления

Мы используем RabbitMQ + StompJS (с SockJS и Spring Websocket в качестве промежуточного программного обеспечения, FWIW) для облегчения трансляции сообщений через веб-сокеты. Все работает отлично, за исключением того, что бы мы ни пытались, StompJS создает очереди без автоматического удаления, что означает, что мы получаем ТОННЫ очередей.

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

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

Если мы остановим проверку кадров до их передачи (на самом низком уровне в глубине источника StompJS), мы увидим, что эти заголовки присутствуют. Однако, похоже, они не попадают в RabbitMQ (или он просто не смотрит на них в команде «ПОДПИСКА» ??) и создает их как не удаляемые автоматически.

Интересно, что если мы заранее создадим очередь вручную как автоматическое удаление, регистрация 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 и StompJS 2.3.3

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


person David Welch    schedule 31.07.2015    source источник
comment
какие реализации stompjs и sockjs вы используете? Я вижу несколько из них через поиск в Google.   -  person Derick Bailey    schedule 01.08.2015
comment
@DerickBailey хороший звонок. Добавил информацию   -  person David Welch    schedule 04.08.2015
comment
Вы когда-нибудь это исправляли? Я наблюдаю точно такую ​​же проблему.   -  person ajames    schedule 21.10.2015
comment
Не отслеживал, но я открыл тикет, и, по-видимому, более новая версия делает это возможным. См. github.com/rabbitmq/rabbitmq-stomp/issues/   -  person David Welch    schedule 21.10.2015


Ответы (2)


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

  • Я работаю против Rabbit 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
});

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

person Jim Liddell    schedule 03.08.2015
comment
Итак, ваш пример работает и будет хорошо работать в большинстве случаев, но в моем сценарии мне нужно, чтобы клиент Stomp привязывался непосредственно к очереди (а не к обмену). Из того, что я могу сказать, если местом назначения является '/ queue / foo' RabbitMQ определит очередь, но это не auto_delete (и если она существовала как автоматическое удаление заранее, выдается ошибка) - person David Welch; 04.08.2015
comment
Ах, извините, не оценил эту деталь. Ну что ж. - person Jim Liddell; 05.08.2015

Это возможно с RabbitMQ 3.6.0+, установив auto-delete в заголовках подписки на true. См. https://www.rabbitmq.com/stomp.html#queue-parameters для подробностей.

person Deepak Kumar    schedule 25.11.2018