【RabbitMQ】三、消息队列之工作模式

本文介绍了RabbitMQ的工作队列模式,包括轮询分发和公平分发,以及消息的应答与持久化。公平分发通过Qos和Acknowledge实现,确保能者多劳。同时,文章还涵盖了消息确认的两种机制:默认的事务型确认和Confirm机制,解释了它们的工作原理和应用场景。
摘要由CSDN通过智能技术生成

一、工作队列 Work Queues

Simple队列是生产者与消费者一对一的关系。在实际开发中,我们经常遇到多个消费者,我们可以想象,生产者发送消息是毫不费力的,然而消费者获取消息通常还需要进行一系列的业务处理,这显然需要一段时间,这时候消息队列可能就会积压很多消息。
在这里插入图片描述

实验代码:轮询分发

实验: 创建两个消费者,消费者1每隔2s接收并处理一次消息,消费者2每隔1s接收并处理一次消息。
查看结果:消费者1和消费者2轮询接收消息,并没有出现谁多处理了一个,谁少处理了一个的现象。

Send

/**
 * 工作队列的生产者
 */
public class Send {
   

    public static final  String QUEUE_NAME = "test_work_queue";

    public static void main(String[] args) throws IOException, InterruptedException {
   
        // 获取连接
        Connection connection = ConnectionUtils.getConnection();
        // 创建一个通道
        Channel channel = connection.createChannel();
        // 声明一个队列
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        // 连续发送消息
        for (int i =0; i < 30; i++){
   

            String msg = "Hello Work Queues :"+i;
            channel.basicPublish("",QUEUE_NAME,null,msg.getBytes());

            System.out.println("Send Msg : "+i);
            Thread.sleep(i*20);

        }
        // 释放连接
        channel.close();
        connection.close();

    }

}

Receive01

/**
 * 工作队列 消费者1获得消息
 */
public class Receive01 {
   

    public static final  String QUEUE_NAME = "test_work_queue";

    public static void main(String[] args) throws IOException {
   
        // 获取连接
        Connection connection = ConnectionUtils.getConnection();
        // 创建一个通道
        Channel channel = connection.createChannel();
        // 声明一个队列
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        // 定义一个消费者
        DefaultConsumer consumer = new DefaultConsumer(channel){
   
            // 获取消息的回调函数
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
   
                String msg = new String(body,"utf-8");
                System.out.println("[1] Receive Msg : "+msg);

                try {
   
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
   
                    e.printStackTrace();
                }finally {
   
                    System.out.println("[1] done ");
                }

            }
        };

        boolean autoAck = true;
        channel.basicConsume(QUEUE_NAME,autoAck,consumer);


    }
}

Receive02

/**
 * 工作队列 消费者2获得消息
 */
public class Receive02 {
   

    public static final  String QUEUE_NAME = "test_work_queue";

    public static void main(String[] args) throws IOException {
   
        // 获取连接
        Connection connection = ConnectionUtils.getConnection();
        // 创建一个通道
        Channel channel = connection.createChannel();
        // 声明一个队列
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        // 定义一个消费者
        DefaultConsumer cons
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_popo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值