1

全部,

我正在尝试使用多个绑定键绑定队列。然而,并不是所有的键都是预先知道的。因此,我amqp_queue_bind使用一个已知的密钥,然后在第二个密钥已知的情况下再次使用amqp_basic_consumeamqp_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

4

1 回答 1

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_queue_bind解决方案是仅在amqp_consume_message不等待消息时调用。

现在看来,我犯了这个错误真是太愚蠢了。

于 2016-04-07T02:13:37.197 回答