0

我在 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

这不起作用。

4

1 回答 1

1

我认为您正在寻找的是消费者取消通知扩展。

在您的情况下,客户端尚未收到有关机器重新启动的通知(换句话说,当机器重新启动时,他们没有收到来自 rabbitmq 代理的“basic.cancel”通知)。

请参阅上面链接的摘录:

在这种意外消费者取消的情况下,代理将向客户端发送 basic.cancel 的扩展。如果代理从客户端接收到 basic.cancel,则不会发送此消息。默认情况下,AMQP 0-9-1 客户端不期望从代理接收 basic.cancel 方法异步,因此为了启用此行为,客户端必须在其客户端属性中提供一个功能表,其中有一个键 consumer_cancel_notify 和一个布尔值 true

我不是 ruby​​ 程序员,但我认为上面链接中的 java 示例应该可以为您提供完整的图片。

于 2012-05-07T19:51:17.360 回答