Мы используем 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), обмен будет определен как автоматическое удаление. Автоматически не удаляются только очереди.