優先級的范圍為`[0, 255]`,通常選擇`[0, 10]`,數字越大優先級越高。因為需要排序,所以數字越大消耗的 cpu 也越多。設置優先級可以有下面兩種方法。
[TOC]
# 1. 通過UI頁面添加一個具有優先級的隊列

<br/>
# 2. 通過代碼創建一個優先級隊列
需要在消費端設置隊列的優先級,也需要在生產者對消息設置優先級,消息的優先級必須小于等于隊列的優先級。
**1. 封裝連接 MQ 服務器的工具類**
```java
public class RabbitMQUtils {
/**
* 連接RabbitMQ服務器
*/
public static Channel getChannel() throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("me.rabbitmq.com");
factory.setUsername("admin");
factory.setPassword("admin");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
return channel;
}
}
```
**2. 生產者**
```java
public class MessageProducer {
private static final String QUEUE_NAME = "queue.hello.priority";
public static void main(String[] args) throws Exception {
try (Channel channel = RabbitMQUtils.getChannel()) {
//給消息添加priority屬性,該屬性就是優先級
AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().priority(5).build();
for (int i = 1; i < 11; i++) {
String message = "info" + i;
if (i == 5) {
channel.basicPublish("", QUEUE_NAME, properties, message.getBytes());
} else {
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
}
System.out.println(MessageProducer.class.getSimpleName() + "[生產了消息]: " + message);
}
}
}
}
```
**3. 消費者**
```java
public class MessageConsumer {
private static final String QUEUE_NAME = "queue.hello.priority";
public static void main(String[] args) throws Exception {
Channel channel = RabbitMQUtils.getChannel();
Map<String, Object> params = new HashMap(16);
//設置隊列的優先級
params.put("x-max-priority", 10);
channel.queueDeclare(QUEUE_NAME, true, false, false, params);
System.out.println(MessageConsumer.class.getSimpleName() + "[等待消費..]");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody());
System.out.println(MessageConsumer.class.getSimpleName() + "[收到消息]: " + message);
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, (consumerTag) -> {
});
}
}
```
**3. 測試**
(1)先啟動生產者,生產如下消息。
```
MessageProducer[生產了消息]: info1
MessageProducer[生產了消息]: info2
MessageProducer[生產了消息]: info3
MessageProducer[生產了消息]: info4
MessageProducer[生產了消息]: info5
MessageProducer[生產了消息]: info6
MessageProducer[生產了消息]: info7
MessageProducer[生產了消息]: info8
MessageProducer[生產了消息]: info9
MessageProducer[生產了消息]: info10
```
(2)啟動消費者,消費了如下消息。消息`info5`優先級最高,所以最先被消費。
```
MessageConsumer[收到消息]: info5
MessageConsumer[收到消息]: info1
MessageConsumer[收到消息]: info2
MessageConsumer[收到消息]: info3
MessageConsumer[收到消息]: info4
MessageConsumer[收到消息]: info6
MessageConsumer[收到消息]: info7
MessageConsumer[收到消息]: info8
MessageConsumer[收到消息]: info9
MessageConsumer[收到消息]: info10
```
****
案例代碼:https://gitee.com/flymini/codes01/tree/master/rabbitmq_/com-learn-rabbitmq04
- 消息隊列
- 什么是MQ
- MQ的作用
- MQ的分類
- MQ的選擇
- RabbitMQ
- RabbitMQ是什么
- 四大核心概念
- 工作原理
- 環境搭建
- windows系統下的搭建
- centos7系統下的搭建
- 常用命令
- 服務相關命令
- 管理用戶命令
- 管理隊列命令
- 第一個RabbitMQ程序
- 工作隊列
- 輪詢分發消息
- 消息應答
- 持久化
- 發布確認
- 發布確認原理
- 發布確認策略
- 交換機概念
- 交換機類型
- 無名交換機
- Fanout交換機
- Direct交換機
- Topic交換機
- 死信隊列
- 死信概念
- 死信來源
- 死信實戰
- 延遲隊列
- 什么是延遲隊列
- TTL設置方式
- 隊列TTL延遲隊列
- 消息TTL延遲隊列
- 插件打造延遲隊列
- 延遲隊列總結
- 發布確認高級
- 代碼實現
- 回退消息
- 備份交換機
- 冪等性
- 冪等性概念
- 消息重復消費
- 消費端冪等性保障
- 優先級隊列
- 使用場景
- 設置優先級
- 惰性隊列
- 什么是惰性隊列
- 隊列的兩種模式
- 聲明惰性隊列
- RabbitMQ集群
- 為什么要搭建集群
- 集群搭建步驟
- 集群工作方式
- 脫離集群
- 鏡像隊列
- 高可用負載均衡