繁体   English   中英

stompjs + rabbitmq - 创建自动删除队列

[英]stompjs + rabbitmq - create Auto-Delete queues

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

我们现在正在努力解决几个小时后清除非活动队列的策略,但我们宁愿只有在所有客户端断开连接后终止的自动删除队列。

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

如果我们在帧被传输之前停止检查帧(在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和StompJS 2.3.3

**注意**如果我直接订阅交易所(目的地为/ exchange / foo或/ topic / foo),交易所将被定义为自动删除。 它只是不自动删除的队列。

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

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

我的第一个建议是尝试我列出的客户端库的特定版本。 我有一些问题让这些很好玩 - 这些版本适合我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM