我们使用 RabbitMQ + StompJS(使用 SockJS 和 Spring Websocket 作为中间件,FWIW)来促进通过 websocket 广播消息。一切都很好,除了无论我们尝试什么,StompJS 都会将队列创建为非自动删除,这意味着我们最终会得到大量的队列。
我们现在正在使用一项策略来解决这个问题,该策略会在几个小时后清除非活动队列,但我们宁愿让自动删除队列在所有客户端断开连接后终止。
我们已经尝试设置 headers 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 等目的地),交换将被定义为自动删除。只有队列不会自动删除。