Rabbit MQ - 为什么我的设置不向所有客户端提供消息?

时间:2013-02-13 18:31:51

标签: java ruby jruby rabbitmq

我在JRuby中有代码:

class Receiver

  def initialize(channel_id)
    @channel_id = channel_id

    factory = ConnectionFactory.new
    factory.setHost("localhost")
    connection = factory.newConnection
    @channel = connection.createChannel
    @channel.exchangeDeclare(exchange_name, "direct");
    @channel.queueDeclare(queue_name, true, false, false, nil)
    @channel.queueBind(queue_name, exchange_name, routing_key)
    @consumer = QueueingConsumer.new(@channel);
    @channel.basicConsume(queue_name, true, @consumer);
  end

  def receive
    String.from_java_bytes @consumer.nextDelivery.getBody
  end

  private

  def queue_name
    @channel_id
  end

  def exchange_name
    @channel_id
  end

  def routing_key
    @channel_id
  end

end

此代码负责在我的架构中获取消息。但是,当我有ie。两个Receiver实例具有相同的channel_id(基本上是交换名称和路由密钥)当我向此交换机发送消息时,一个消息转发到一个接收者,一个接收到另一个接收者。为什么,我做错了什么?

1 个答案:

答案 0 :(得分:3)

问题是为什么你想要同时订阅单个队列的2个代理人做出某些动作?通常在RabbitMQ中,多个代理可以订阅一个队列,但它们都执行相同的操作,并且用于冗余/负载平衡目的。随机代理从队列中获取消息并对其进行确认,然后将其清除以供其他任何人使用。

通常,队列意味着一个操作,并且代理侦听是等效的,并且可以接收消息。如果您希望将消息发送到一个地方然后广播到多个代理,则最好使用扇出交换,并让每个代理侦听单独的队列。

因此,请将每个队列视为一件事。您描述的行为正是预期的行为。

有关设置扇出交换的详细信息以及不同的交换所执行的操作,请参阅this tutorial