0

我在 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。当我向此交换机发送消息时,具有相同 channel_id 的两个实例Receiver(基本上是交换机名称和路由密钥),一条消息发送给一个接收者,一个发送给另一个接收者。为什么,我做错了什么?

4

1 回答 1

3

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

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

所以把每个队列想象成它在做一件事。您所描述的行为正是预期的。

请参阅本教程以获取有关设置扇出交换以及不同交换的作用的详细信息。

于 2013-02-13T19:17:54.150 回答