在RabbitMQ中如何使用特定密钥消耗多个消息或读取队列中的所有消息或所有消息?

时间:2014-03-25 22:03:00

标签: rabbitmq message-queue

我想使用来自特定队列的多条消息或使用给定密钥的特定交换。

所以场景如下:

Publisher通过队列1发布消息1 发布者通过队列1发布消息2 发布者通过队列1发布消息3 发布者通过队列2发布消息4 发布者通过队列2发布消息5 .. 消费者使用队列1中的消息 同时获取[消息1,消息2,消息3]并在一次回叫中处理它们

listen_to(queue_name , num_of_msg_to_fetch or all, function(messages){
//do some stuff with the returned list
});

消息不是同时发生的,它就像是事件,我想将它们收集在队列中,打包并发送给第三方。

我也读过这篇文章:

http://rabbitmq.1065348.n5.nabble.com/Consuming-multiple-messages-at-a-time-td27195.html

由于

3 个答案:

答案 0 :(得分:0)

不要直接从队列中消费,因为队列遵循循环算法(AMQP授权) 使用铲子将队列内容传输到扇出交换机并直接从此交换消息。您将获得所有连接的消费者的所有消息。 :)

答案 1 :(得分:0)

如果您想使用来自特定队列的多条消息,您可以尝试如下。

channel.queueDeclare(QUEUE_NAME, false, false,false, null);
Consumer consumer = new DefaultConsumer(channel){
   @Override
   public void handleDelivery(String consumerTag,
                                       Envelope envelope,
                                       AMQP.BasicProperties properties,
                                       byte[] body)
                    throws IOException {
                
                    String message = new String(body, "UTF-8");
                    logger.info("Recieved Message --> " + message);
                
   }
};

答案 2 :(得分:0)

您可能需要在概念上将域消息与 RMQ 消息分开。作为生产者,您可以将多个域消息捆绑到单个 RMQ 消息中,然后将其 .produce() 到 RMQ。请记住,由于窗口的存在,这种设计引入了超时和延迟(您可能会从 Kafka 那里得到一些印象,它以延迟为代价进行捆绑以优化 I/O)。

作为消费者,您将拥有一个具有典型 .handleDelivery 实现的消费者,该实现将转换接收到的正文以进行处理:byte[] -> Set[DomainMessage] -> your listener