【问题标题】:How to check if queue with auto-generated name (amq.gen-*) exists?如何检查具有自动生成名称(amq.gen-*)的队列是否存在?
【发布时间】: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. 前缀。谢谢!

标签: erlang rabbitmq


【解决方案1】:

如果队列已经存在,您可以使用前缀amq. 声明队列。如果队列存在,您将获得Declare-Ok,如果不存在,您将获得access-refused。 (不过,我的问题是你为什么要这样做?;)

此外,您可以使用被动选项来检查它是否已经存在。根据AMQP reference,如果队列不存在,服务器会将其视为not-found 错误。为了在您的 Erlang 客户端中捕捉到​​这一点,您可以尝试以下几行:

try 
    %% declare queue with passive=true
    queue_exists
catch exit:{{shutdown, {server_initiated_close,404,_},_,_} -> 
    queue_does_not_exist 
end

【讨论】:

  • 感谢您提供此信息,它确实很有帮助,并且实际上回答了我的问题,尽管并不能完全解决我的问题 :) 在 gen_server 的初始化回调中捕获 exit:Reason(这是我尝试检测队列是否存在的地方)导致进一步Handler sse_handler terminating in init/3 for the reason exit:{noproc, {gen_server,call, ...。我将尝试在单独的评论中描述我想要实现的目标。也许我的哲学在这里是错误的:)
  • 我想sse_handler 是和rabbitmq 客户端链接在一起的。
猜你喜欢
  • 2014-04-07
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多