我在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(基本上是交换名称和路由密钥)当我向此交换机发送消息时,一个消息转发到一个接收者,一个接收到另一个接收者。为什么,我做错了什么?
答案 0 :(得分:3)
问题是为什么你想要同时订阅单个队列的2个代理人做出某些动作?通常在RabbitMQ中,多个代理可以订阅一个队列,但它们都执行相同的操作,并且用于冗余/负载平衡目的。随机代理从队列中获取消息并对其进行确认,然后将其清除以供其他任何人使用。
通常,队列意味着一个操作,并且代理侦听是等效的,并且可以接收消息。如果您希望将消息发送到一个地方然后广播到多个代理,则最好使用扇出交换,并让每个代理侦听单独的队列。
因此,请将每个队列视为一件事。您描述的行为正是预期的行为。
有关设置扇出交换的详细信息以及不同的交换所执行的操作,请参阅this tutorial。