rabbitmq使用多个绑定键绑定相同的队列

时间:2016-04-05 15:12:50

标签: rabbitmq amqp rabbitmq-c

所有

我正在尝试使用多个绑定键绑定队列。但是,并非所有密钥都是预先知道的。所以,我使用一个已知密钥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 个答案:

答案 0 :(得分:0)

这是我所犯的错误和解决方案:

以下是应用流程:

有一个消息处理线程:

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

这是主要的app线程: 在了解绑定密钥后,稍后会发生:

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

现在看来我犯这个错误真是太傻了。