《RabbitMQ篇》消费者轮询消费消息

当有多个消费者都在同一个队列中拿取消息时,会轮询从队列中拿取消息消费。

RabbitMQUtil类为工具类,获取Channel。

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class RabbitMQUtil {
    public static Channel getChannel() throws Exception {
        //得到工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setUsername("guest");
        factory.setPassword("guest");
        //生成连接
        Connection connection = factory.newConnection();
        //获取信道
        return connection.createChannel();
    }
}
  1. 创建一个生产者,并启动
import com.rabbitmq.client.Channel;

import java.util.Scanner;

public class Producer {
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMQUtil.getChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String message = sc.next();
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
        }
    }
}
  1. 创建两个消费者,并启动
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

public class Consumer1 {
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMQUtil.getChannel();
        DeliverCallback deliverCallback = (consumerTag, message) -> {
            System.out.println("接收到信息:" + new String(message.getBody()));
        };
        CancelCallback cancelCallback = consumerTag -> {
            System.out.println("消息消费被中断");
        };
        System.out.println("C1消费者启动等待消费......");
        channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);
    }
}
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

public class Consumer2 {
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMQUtil.getChannel();
        DeliverCallback deliverCallback = (consumerTag, message) -> {
            System.out.println("接收到信息:" + new String(message.getBody()));
        };
        CancelCallback cancelCallback = consumerTag -> {
            System.out.println("消息消费被中断");
        };
        System.out.println("C2消费者启动等待消费......");
        channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);
    }
}
  1. 运行结果图如下。可以看到两个消费者轮流从队列中拿取消息消费。

好的,下面是一个简单的 RabbitMQ 广播轮询消费的示例代码: ```python import pika # 连接到 RabbitMQ 服务器 connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 声明一个 fanout 类型的 exchange channel.exchange_declare(exchange='logs', exchange_type='fanout') # 创建一个临时队列,队列名称为空字符串,RabbitMQ 会自动分配一个随机名称 result = channel.queue_declare('', exclusive=True) queue_name = result.method.queue # 将队列绑定到 exchange 上 channel.queue_bind(exchange='logs', queue=queue_name) print(' [*] Waiting for logs. To exit press CTRL+C') # 定义一个回调函数来处理收到的消息 def callback(ch, method, properties, body): print(" [x] %r" % body) # 向 RabbitMQ 服务器注册一个消费者 channel.basic_consume(queue=queue_name, on_message_callback=callback, auto_ack=True) # 开始接收和处理消息 channel.start_consuming() ``` 这段代码中,我们首先创建了一个 fanout 类型的 exchange,然后创建了一个临时队列,并将其绑定到 exchange 上,这样所有发送到 exchange 上的消息都会被路由到该队列上。最后,我们定义了一个回调函数来处理收到的消息,并向 RabbitMQ 服务器注册一个消费者来接收消息。调用 `channel.start_consuming()` 启动消费者。 注意,在广播模式下,每个消费者都会接收到相同的消息,因此如果有多个消费者同时监听同一个队列,那么消息会被轮询地发送给每个消费者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值