我在3台工作机器上通过AMQP gem运行rabbitmq。重新启动计算机后,我的队列显示只添加了工作程序,而不是取消订阅。例如,假设每台机器运行5名工人:
当我启动3台机器时,我有15名工作人员订阅了这个队列 当我关闭所有3台机器时,我仍然有15名工人订阅了这个队列 当我重新启动3台机器时,我现在有30名工作人员订阅了队列
实际上,我应该只有15名工人。
当机器重新启动/关闭时,如何确保与任务队列的连接关闭?我试过了:
Signal.trap("INT") do #handles the ctrl c case
connection.close do
EM.stop { exit }
end
end
Signal.trap("TERM") do #handles the reboot and shut down case
connection.close do
EM.stop { exit }
end
end
这不起作用。
答案 0 :(得分:1)
我认为您正在寻找的是Consumer cancellation Notification扩展名。
在您的情况下,客户端尚未收到重新启动计算机的通知(换句话说,当计算机重新启动时,他们没有从rabbitmq代理收到'basic.cancel'通知)。
参见以上链接摘录:
在此类意外消费者取消的情况下,代理将向客户端发送basic.cancel的扩展名。如果代理从客户端接收basic.cancel,则不会发送此消息。默认情况下,AMQP 0-9-1客户端不希望异步接收来自代理的basic.cancel方法,因此为了启用此行为,客户端必须在其客户端属性中提供一个功能表,其中存在key consumer_cancel_notify和布尔值true
我不是红宝石程序员,但我认为上面链接中的java示例应该可以为您提供完整的图片。