2016-04-05 14 views
1

すべて、rabbitmq複数のバインディングキーを持つ同じキューをバインドする

複数のバインディングキーでキューをバインドしようとしています。ただし、すべてのキーが先行しているわけではありません。だから、amqp_queue_bindを1つの既知のキーで実行し、次にamqp_basic_consume以降のamqp_queue_bindを再度実行します。

amqp_queue_bindが立ち往生し、SIGSEGVを使用して、私のプロセスのコアを得ることに、私は次のスタックトレースを参照してください。私はバインディングを追加したい場合は

poll 
recv_with_timeout 
wait_frame_inner 
amqp_simple_rpc 
amqp_simple_rpc_decoded 
amqp_queue_bind 

私はamqp_basic_cancelを行うとamqp_basic_consumeを再実行する必要があります後で鍵?ここで

+0

[link](http://rabbitmq.1065348.n5.nabble.com/Make-queue-bind-after-basic-consume-rabbitmq-c-td27879.html)にもこの問題が掲載されています。 –

答えて

0

は私が作ったとソリューションいた間違いである:ここでは

は、アプリの流れです:

メッセージ処理スレッドがあります:

amqp_exchange_declare 
amqp_queue_declare 
while (1) { 
    if (consume_done) { 
    amqp_maybe_release_buffers 
    amqp_consume_message 
    app specific processing. 
    } 
} 

これは、メインアプリケーションスレッドです: バインディングキーを知ることで、後で起こる:

amqp_queue_bind 
if (!consume_done) { 
    amqp_basic_consume 
    consume_done 
} 

後で複数のバインディングキーが学習されるため、上記のルーチンはメインのアプリケーションスレッドコンテキストで複数回呼び出されます。

初回は成功し、メッセージも受け取ります。しかし、もう一度amqp_queue_bindコールがハングアップします。

ここで問題はメッセージ処理スレッドが無限のタイムアウトでamqp_consume_messageを実行していることです。この状態ではメインスレッドからamqp_queue_bindを通過するとは限りません。

amqp_consume_messageがメッセージを待っていない場合に限り、amqp_queue_bindを呼び出すことです。

私は今このミスをしたのはとても愚かなようです。

関連する問題