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
не ждет сообщений.
Теперь мне кажется глупым, что я совершил эту ошибку.