【发布时间】:2012-11-15 17:52:46
【问题描述】:
如果是未生成的名称,只需调用#'queue.declare' 即可获取新创建的队列或具有给定名称的现有队列。但是,当使用自动生成的名称(以 amq.gen- 前缀开头)时,它并不是那么简单。首先amq.是受限前缀,所以没有办法调用#'queue.declare'{queue=<<"amq.gen-xxx">>}。
我也尝试使用passive=true 选项,虽然我可能会传递受限名称,但当队列不存在时我会收到退出错误。以下是错误报告:
** Handler sse_handler terminating in init/3
for the reason exit:{{shutdown,
{server_initiated_close,404,
<<"NOT_FOUND - no queue 'amq.gen-wzPK0nIBPzr-dwtZ5Jy58V' in vhost '/'">>}},
{gen_server,call,
[<0.62.0>,
{call,
{'queue.declare',0,
<<"amq.gen-wzPK0nIBPzr-dwtZ5Jy58V">>,
true,false,false,false,false,[]},
none,<0.269.0>},
infinity]}}
有没有办法解决这个问题?
编辑:这是这个问题背后的一个小故事。免责声明:我是二郎新手,所以也许有更好的方法让它工作:)
我有一个基于 gen_server 的应用程序,它与 Web 浏览器保持 SSE(服务器端事件)连接。每个连接都绑定到 rabbitmq 队列。 SSE 连接中断时,在给定超时后自动尝试重新连接 - 这是 Web 浏览器开箱即用的支持。为了重用以前创建的队列,我试图检查给定名称的队列(取自请求 cookie)是否已经存在。这一切都在init 回调中完成。
【问题讨论】:
-
rabbitmqctl命令可以列出队列。这有帮助吗? -
感谢您的回答,但我需要在我的应用程序中进行动态检查,而不是从命令行。
-
我还是不明白为什么你需要用“amq”来命名队列。字首。如果您通过 cookie 或其他方式获得队列名称的提示,为什么不创建自己的命名约定?然后你可以声明一个队列,不管它之前是否存在。
-
@Tilman 确实解决了我的问题。我仅将自动生成的队列用于它们的随机名称,但我刚刚发现,我可以自己生成随机名称,而无需限制
amq.前缀。谢谢!