我们使用RabbitMQ + StompJS (w/ SockJS和Spring作为中间件,FWIW)来方便通过Websocket广播消息。一切都很好,但不管我们怎么尝试,StompJS都会以非自动删除的方式创建队列,这意味着我们最终会有大量的队列。
我们现在使用的策略是在几个小时后清除不活动的队列,但我们更希望在所有客户端断开连接后终止自动删除队列。
我们尝试设置标题auto_delete、auto-delete、autoDelete和所有其他我们可以找到的咒语。
如果我们在帧被传输之前停止检查它们(在StompJS源的深度中尽可能低的级别),我们可以看到这些标头的存在。但是,他们似乎没有把它转到RabbitMQ (或者它只是不使用“订阅”命令?)并将其创建为非自动删除。
有趣的是,如果我们预先以自动删除的方式手动创建队列,StompJS注册将导致错误退出,因为请求的订阅预期不会自动删除。这表明是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),则该交易所将被定义为自动删除。只有队列才不是自动删除。
发布于 2015-08-03 08:08:55
我在生产中使用StompJS/RabbitMQ,我没有看到这个问题。我不能确切地说出你的问题是什么,但我可以详细说明我的设置,希望你能发现一些可能有帮助的差异。
由于我不想进入这里的原因-我已经禁用了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
});我的第一个建议是尝试我列出的客户端库的特定版本。我有一些问题,让这些发挥良好-和这些版本为我工作。
发布于 2018-11-25 14:41:45
使用RabbitMQ 3.6.0+可以通过在订阅标头中设置auto-delete到true。详情请见https://www.rabbitmq.com/stomp.html#queue-parameters。
https://stackoverflow.com/questions/31755009
复制相似问题