文章目录
- 为什么要设置优先级队列
- 添加依赖
- 生产者代码
- 消费者代码
- 测试
为什么要设置优先级队列
RabbitMQ队列中的信息采取先进先出的方式,先生产的消息先被消费,有时我们会遇到一些对生产的消息进行排序的场景,如某平台想要对大客户的订单信息优先处理,这时就需要用到优先级了,优先级范围0-255,数字越大优先级越高,在我们日常学习,练习使用时,不需要这么高的优先级,设置0-10即可
那下面我们就开始实现一下吧
这里需要先创建一些信息到队列中,再被消费者消费,不能像之前那样创建一个就被消费一个,否则就不能体现出优先级的作用
这里我们用maven工程整合RabbitMQ
添加依赖
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.8.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
生产者代码
这里写代码的方式和在之前用springboot种的方式不同,可以稍微了解一下
这里我们使用循环生产了10个数据,1-10,其中数字六的优先级为6,数字2的优先级为2,其他数字不设优先级,在优先级之后按照先进先出的顺序排列。那么输出结果应该按照6,2,1,3,4,5,7,8,9这样的顺序。
/**
* 生产者:发消息
*/
public class Producer {
//队列名称
public static final String QUEUE_NAME = "hello";
//发消息
public static void main(String[] args) throws IOException, TimeoutException {
//创建一个连接工厂
ConnectionFactory factory = new ConnectionFactory();
//工厂IP连接RabbitMq队列
factory.setHost("");
//用户名
factory.setUsername("admin");
//密码
factory.setPassword("admin");
//创建连接
Connection connection = factory.newConnection();
//获取信道
Channel channel = connection.createChannel();
Map<String,Object> arguments = new HashMap<>();
arguments.put("x-max-priority",10);
/**
* 生成一个队列
* 1.队列名称
* 2.队列里面的消息是否持久化(磁盘),默认情况消息存在内存中
* 3.该队列是否只供一个消费者消费,true可以多个消费者消费;false:只能一个消费者消费
* 4.是否自动删除,最后一个消费者断开连接以后,该队一句是否自动删除 true是,false否
* 5.其他参数
*/
channel.queueDeclare(QUEUE_NAME,true,false,false,arguments);
for (int i = 1; i < 11; i++) {
String message = "info"+i;
if(i==5){
AMQP.BasicProperties properties=
new AMQP.BasicProperties().builder().priority(5).build();
channel.basicPublish("",QUEUE_NAME,properties,message.getBytes());
}else {
channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
}
}
/**
* 发送一个消费
* 1.发送到哪个交换机
* 2.路由key值是哪个,本次是队列名称
* 3.其他参数信息
* 4.发送的消息
*/
//channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
System.out.println("消息发送完毕!");
}
}
其中,这里就是添加优先级的方式,map中添加优先级,再传到其它参数的位置中
Map<String,Object> arguments = new HashMap<>();
arguments.put(“x-max-priority”,10);
消费者代码
public class Consumer {
//队列的名称
public static final String QUEUE_NAME = "hello";
//接收消息
public static void main(String[] args) throws IOException, TimeoutException {
//创建一个连接工厂
ConnectionFactory factory = new ConnectionFactory();
//工厂IP连接RabbitMq队列
factory.setHost("");
//用户名
factory.setUsername("admin");
//密码
factory.setPassword("admin");
//创建连接
Connection connection = factory.newConnection();
//获取信道
Channel channel = connection.createChannel();
//声明,接收消息
DeliverCallback deliverCallback = (consumerTag,message)->{
System.out.println(new String(message.getBody()));
};
//取消消息的回调
CancelCallback cancelCallback = consumerTag->{
System.out.println("消息消费被中断");
};
/**
*消费者消费信息
* 1.消费哪个队列
* 2.消费成功后是否自动应答,true/false
* 3.消费者未成功消费的回调
* 4.消费者取消消费的回调
*/
channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback);
}
}
测试
先运行生产者代码,生产消息
成功,再运行消费者代码,消费消息
可以看到,设置优先级的数字排在前面,优先级大的数字排在优先级小的数字前面,后面的数字按照先进先出的方式排列
测试结束