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]}}

この問題を解決する方法はありますか?

編集これは、この質問の背後にある短い話です。免責事項: 私は erlang の初心者なので、それを機能させるためのより良い方法があるかもしれません :)

Web ブラウザーとの SSE (サーバー側イベント) 接続を保持する gen_server ベースのアプリケーションがあります。各接続は 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 に答える