如果是非生成名稱,則只需撥打#'queue.declare'
即可獲取新創建的隊列或現有姓名。但是,當使用自動生成的名稱(以amq.gen-
前綴開頭)時,它不是微不足道的。首先,amq.
是受限制的前綴,因此無法撥打#'queue.declare'{queue=<<"amq.gen-xxx">>}
。如何檢查帶自動生成名稱(amq.gen- *)的隊列是否存在?
我也嘗試使用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]}}
有什麼辦法可以解決這個問題嗎?
編輯:這是這個問題背後的一個小故事。免責聲明:我是erlang新手,所以也許有更好的方式來使它工作:)
我有一個基於gen_server的應用程序持有與web瀏覽器SSE(服務器端事件)連接。每個連接綁定到rabbitmq隊列。 SSE連接斷開後,在給定的超時後自動嘗試重新連接 - 這是Web瀏覽器支持的開箱即用功能。要重用先前創建的隊列,我試圖檢查給定名稱的隊列(從請求cookie獲取)是否已經存在。這一切都在init
回調完成。
'rabbitmqctl'命令可以列出隊列。這有幫助嗎? – halfelf
感謝您的回答,但我需要在應用程序中動態檢查,而不是從命令行進行檢查。 – Michal
我還是不明白你爲什麼需要用「amq」命名隊列。字首。如果通過cookie獲取隊列名稱的提示,或者不是,那麼爲什麼不創建自己的命名約定呢?然後你可以聲明一個隊列,不管它是否存在過。 – Tilman