2012-11-14 37 views
1

如果是非生成名稱,則只需撥打#'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回調完成。

+1

'rabbitmqctl'命令可以列出隊列。這有幫助嗎? – halfelf

+0

感謝您的回答,但我需要在應用程序中動態檢查,而不是從命令行進行檢查。 – Michal

+1

我還是不明白你爲什麼需要用「amq」命名隊列。字首。如果通過cookie獲取隊列名稱的提示,或者不是,那麼爲什麼不創建自己的命名約定呢?然後你可以聲明一個隊列,不管它是否存在過。 – Tilman

回答

0

如果隊列已存在,則可以使用前綴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 
+0

感謝這些信息,這真的很有幫助,並且實際上回答了我的問題,但並未完全解決我的問題:)在gen_server的init回調中捕獲'exit:Reason'(這是我嘗試檢測隊列是否存在的原因)會導致進一步處理sse_handler終止於init/3中,原因是退出:{noproc,{gen_server,call,...'。我將嘗試在單獨的評論中描述我試圖達到的目標。也許我的哲學在這裏是錯誤的:) – Michal

+0

我想'sse_handler'與rabbitmq客戶端連接在一起。 – Tilman