1

在未生成名称的情况下,调用#'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回调中完成。

4

1 回答 1

0

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

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

try 
    %% declare queue with passive=true
    queue_exists
catch exit:{{shutdown, {server_initiated_close,404,_},_,_} -> 
    queue_does_not_exist 
end
于 2012-11-15T06:08:19.707 回答