Erlang 如何检查自动生成名称(amq.gen-*)的队列是否存在?

Erlang 如何检查自动生成名称(amq.gen-*)的队列是否存在?,erlang,rabbitmq,Erlang,Rabbitmq,对于未生成的名称,只需调用#“queue.declare”即可获得新创建的队列或具有给定名称的现有队列。然而,当使用自动生成的名称(以amq.gen-前缀开头)时,它并不是那么简单。首先,amq.是受限前缀,因此无法调用#'queue.declare'{queue=} 我还尝试使用passive=true选项,尽管我可以传递受限名称,但当队列不存在时,我会得到一个退出错误。以下是错误报告: ** Handler sse_handler terminating in init/3 for t

对于未生成的名称,只需调用
#“queue.declare”
即可获得新创建的队列或具有给定名称的现有队列。然而,当使用自动生成的名称(以
amq.gen-
前缀开头)时,它并不是那么简单。首先,
amq.
是受限前缀,因此无法调用
#'queue.declare'{queue=}

我还尝试使用
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]}}
**Handler sse_Handler终止于init/3
退出原因:{{shutdown,
{服务器启动关闭,404,
}},
{gen_服务器,呼叫,
[,
{打电话,
{'queue.declare',0,
,
真,假,假,假,假,[]},
没有,},
无限]}
有没有办法解决这个问题

编辑:下面是这个问题背后的一个小故事。免责声明:我是erlang新手,所以也许有更好的方法让它工作:)


我有一个基于gen_服务器的应用程序,它与web浏览器保持SSE(服务器端事件)连接。每个连接都绑定到rabbitmq队列。SSE连接断开时,会在给定超时后自动尝试重新连接-这是web浏览器开箱即用的支持。为了重用以前创建的队列,我试图检查给定名称的队列(取自请求cookie)是否已经存在。这一切都是在
init
callback中完成的

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

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

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

rabbitmqctl
命令可以列出队列。这有帮助吗?谢谢你的回答,但我需要在我的应用程序中进行动态检查,而不是从命令行。我仍然不明白为什么需要使用“amq.”前缀命名队列。如果您通过cookie或其他方式得到队列名称的提示,为什么不创建自己的命名约定呢?然后你可以声明一个队列,不管它以前是否存在。@Tilman确实,这解决了我的问题。我只对随机名称使用自动生成的队列,但我刚刚发现,我可以自己生成随机名称,而无需限制
amq.
前缀。谢谢感谢这些信息,它真的很有帮助,实际上回答了我的问题,尽管并不能完全解决我的问题:)在gen_服务器的init回调中捕获
exit:Reason
(我尝试在这里检测队列是否存在)会导致进一步的
处理程序sse_处理程序在init/3中终止,原因是exit:{noproc,{gen_server,call,…
。我将尝试在单独的注释中描述我试图实现的目标。也许我的理念在这里是错误的:)我认为
sseu handler
与rabbitmq客户端链接在一起。