rabbitMQ对优先级队列的使用

注意事项:

1.队列设置优先级 权制范围(0-255)推荐0-10 否则浪费CPU与内存

2.发消息时给消息设置优先级

3.消息需要完全事先在队列中,在被消费者消费 会被排序,否则边生产边消费不会达到预期的队列优先效果。

优先级队列:

0-255越大越优先

推荐:0-10 CPU性能友好

先生产者生产消息:

java 复制代码
package com.esint.rabbitmq.work07;

import com.esint.rabbitmq.RabbitMQUtils;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class Producer {

    public static final String QUEUE_NAME = "hello";

    public static void main(String[] args) throws Exception {

        Channel channel = RabbitMQUtils.getChannel();

        Map<String, Object> arguments = new HashMap<>();

        //队列设置优先即参数范围
        arguments.put("x-max-priority",10);//官方允许0-255 此处设置10 允许优先级范围 0-10  不设置过大 浪费CPU和内存

        channel.queueDeclare(QUEUE_NAME,false,false,false,arguments);

        //注意上面要求的 需要事先 发送完毕消息  才能体显现优先级的消息优化排序
        for (int i = 0; i < 10; i++) {
            String message = "msssage" + i;

            if(i == 3 ){
                //本实验的核心操作再次 在这里构建优先级设置参数 设置这个优先级的值需要在前面设置对立参数范围内
                AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().priority(5).build();
                channel.basicPublish("",QUEUE_NAME,properties,message.getBytes(StandardCharsets.UTF_8));
            }else{
                channel.basicPublish("",QUEUE_NAME,null,message.getBytes(StandardCharsets.UTF_8));
            }

        }
    }
}

消费者消费消息:

java 复制代码
package com.esint.rabbitmq.work07;

import com.esint.rabbitmq.RabbitMQUtils;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import com.rabbitmq.client.Delivery;

public class Comsumer {

    public static final String QUEUE_NAME = "hello";

    public static void main(String[] args) throws Exception {

        Channel channel = RabbitMQUtils.getChannel();

        DeliverCallback deliverCallback = ( consumerTag, message)->{
            System.out.println(new String(message.getBody(),"UTF-8"));
        };
        CancelCallback cancelCallback = (consumerTag)->{

        };
        channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback);

    }
}

用到的工具类:

java 复制代码
package com.esint.rabbitmq;

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

public class RabbitMQUtils {

    public static Channel getChannel()throws Exception{
        //创建链接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();

        //设置链接
        connectionFactory.setHost("192.168.43.37");
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("admin");

        //链接工厂创建链接
        Connection connection = connectionFactory.newConnection();

        //获取信道
        Channel channel = connection.createChannel();

        return channel;

    }

    public static final void Sleep(int nums)  {
        try {
            Thread.sleep(nums * 1000);
        }catch (InterruptedException _ignored){
            Thread.currentThread().interrupt();
        }
    }
}

产生的结果:

log 复制代码
Connected to the target VM, address: '127.0.0.1:59793', transport: 'socket'
msssage3
msssage0
msssage1
msssage2
msssage4
msssage5
msssage6
msssage7
msssage8
msssage9
相关推荐
livemetee1 小时前
关于【Kafka高可用配置】
分布式·kafka
TTBIGDATA1 小时前
【Ambari Plus】11.Kafka 安装
大数据·hadoop·分布式·kafka·ambari·hdp·ambari plus
李昊哲小课1 小时前
Ubuntu26.04 搭建 Hadoop3.5.0 完全分布式
大数据·hadoop·分布式·ubuntu·hdfs·mapreduce
newbe365244 小时前
我们如何使用 impeccable 优化前端界面设计与实现稳定性
前端·人工智能·分布式·github·aigc·wpf
清心歌12 小时前
Seata AT 模式简单学习及总结
分布式·seata
rebibabo16 小时前
Java基础(番外) | Kafka 入门:分区、副本与消费者组原理
java·分布式·kafka·学习笔记·副本·分区·异步日志
swg32132118 小时前
Kafka基于ZK和KRaft的设计原理与差异
分布式·kafka
gb448oww519 小时前
Redis分布式锁进阶第三十五篇
数据库·redis·分布式
2601_9624408420 小时前
计算机毕业设计之jsp教室管理系统
java·开发语言·笔记·分布式·算法·课程设计·推荐算法
无小道1 天前
Redis——主从复制
数据库·redis·分布式·主从