所有
我正在尝试使用多个绑定键绑定队列。但是,并非所有密钥都是预先知道的。所以,我使用一个已知密钥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
?
答案 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
。
现在看来我犯这个错误真是太傻了。