Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Rabbit MQ-为什么我的安装程序不向所有客户端提供消息?_Java_Ruby_Jruby_Rabbitmq - Fatal编程技术网

Java Rabbit MQ-为什么我的安装程序不向所有客户端提供消息?

Java Rabbit MQ-为什么我的安装程序不向所有客户端提供消息?,java,ruby,jruby,rabbitmq,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.e

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

此代码负责在我的体系结构中获取消息。然而,当我有两个具有相同通道id(基本上是交换名称和路由密钥)的
Receiver
的ie实例时,当我向该交换发送消息时,一条消息会传递给一个接收者,一个传递给另一个接收者。为什么,我做错了什么?

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

通常,队列意味着一个操作,而侦听的代理是等效的,可以拾取消息。如果您想让消息到达一个地方,然后广播到多个代理,最好使用扇出交换,让每个代理在单独的队列上侦听

因此,请将每个队列看作是在做一件事。你所描述的行为正是你想要的


有关设置扇出交换机以及不同交换机的功能的详细信息,请参阅。

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

通常,队列意味着一个操作,而侦听的代理是等效的,可以拾取消息。如果您想让消息到达一个地方,然后广播到多个代理,最好使用扇出交换,让每个代理在单独的队列上侦听

因此,请将每个队列看作是在做一件事。你所描述的行为正是你想要的


有关设置扇出交换机以及不同交换机的功能的详细信息,请参阅。

我知道扇出模式。但我知道这里出了什么问题,为什么发送到exchange的消息不会发送到每个注册到exchange的消费者?您的消费者没有注册到exchange,而是注册到队列。队列的工作方式与队列的工作方式完全相同,先进先出。如果有两个使用者注册到一个队列中,则他们不会同时获得消息,第一个收到ACK的使用者将收到消息。排队是向交易所登记的。要获得所需的行为,您将需要一个扇出交换,其中注册了两个队列,每个队列上都有一个使用者。扇出交换不是扇出给使用者,而是扇出给队列。您有一个包含两个消费者的队列。我知道扇出模式。但我知道这里出了什么问题,为什么发送到exchange的消息不会发送到每个注册到exchange的消费者?您的消费者没有注册到exchange,而是注册到队列。队列的工作方式与队列的工作方式完全相同,先进先出。如果有两个使用者注册到一个队列中,则他们不会同时获得消息,第一个收到ACK的使用者将收到消息。排队是向交易所登记的。要获得所需的行为,您将需要一个扇出交换,其中注册了两个队列,每个队列上都有一个使用者。扇出交换不是扇出给使用者,而是扇出给队列。您有一个包含两个使用者的队列。如果您使用JRuby和RabbitMQ,请看一下HotBunnies:它是Java RabbitMQ驱动程序之上的一个抽象。我检查了它,但有一些问题。我的用例非常简单-我只需要为每个连接发送一条消息,而且在java库上执行更容易。如果您使用JRuby和RabbitMQ,请查看HotBunnies:它是java RabbitMQ驱动程序之上的一个抽象。我检查了它,但我有一些问题。我的用例非常简单——我只需要为每个连接发送一条消息,而且在顶级java库中更容易做到这一点。