rabbitmq, связывающий одну и ту же очередь с несколькими ключами связывания

Все,

Я пытаюсь связать очередь с несколькими ключами связывания. Однако не все ключи известны заранее. Итак, я делаю amqp_queue_bind с одним известным ключом, а затем 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 если я хочу добавить обязательный ключ позже?

1 ответ

Вот ошибка, которую я сделал, и решение:

Вот поток приложения:

Есть ветка обработки сообщений:

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_queue_bind только когда amqp_consume_message не ждет сообщений.

Теперь мне кажется глупым, что я совершил эту ошибку.

Другие вопросы по тегам