4

我们使用 RabbitMQ + StompJS(使用 SockJS 和 Spring Websocket 作为中间件,FWIW)来促进通过 websocket 广播消息。一切都很好,除了无论我们尝试什么,StompJS 都会将队列创建为非自动删除,这意味着我们最终会得到大量的队列。

我们现在正在使用一项策略来解决这个问题,该策略会在几个小时后清除非活动队列,但我们宁愿让自动删除队列在所有客户端断开连接后终止。

我们已经尝试设置 headers auto_deleteauto-deleteautoDelete以及我们能找到的所有其他可能的咒语。

如果我们在传输帧之前停止检查帧(在 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 等目的地),交换将被定义为自动删除。只有队列不会自动删除。

4

2 回答 2

0

我在生产中使用 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
});

我的第一个建议是尝试我列出的特定版本的客户端库。我有一些问题让这些播放得很好 - 这些版本对我有用。

于 2015-08-03T08:08:55.943 回答
0

RabbitMQ 3.6.0+ 可以通过将auto-delete订阅标头设置为true. 有关详细信息,请参阅https://www.rabbitmq.com/stomp.html#queue-parameters

于 2018-11-25T14:41:45.210 回答