优先级队列
如何添加优先级
- 选择
Maximum priority
,指定优先级的数值,设定范围为0-255,如果值为10,那么就是0-10,最大不能超过255
代码形式
Map<String,Object> params = new HashMap<>();
params.put("x-max-priority",10);
channel.queueDeclare("hello",true,false,false,params);
案例演示
生产者代码
/**
* 优先级队列 生产者
*/
public class PriorityProducer {
public static void main(String[] args) throws IOException {
Channel channel = RabbitUtil.getChannel();
AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().priority(5).build();
for (int i = 0; i < 10; i++) {
String message = "info"+ i;
if (i==5){
channel.basicPublish("","hello",properties,message.getBytes(StandardCharsets.UTF_8));
}else {
channel.basicPublish("","hello",null,message.getBytes(StandardCharsets.UTF_8));
}
}
System.out.println("发送消息完成");
}
}
消费者代码
/**
* 优先级队列 消费者
*/
public class PriorityConsumer {
public static void main(String[] args) throws IOException {
Channel channel = RabbitUtil.getChannel();
Map<String,Object> params = new HashMap<>();
params.put("x-max-priority",10);
channel.queueDeclare("hello",true,false,false,params);
System.out.println("消费者启动等待消费...");
DeliverCallback deliverCallback = (consumerTag, message) -> {
String received = new String( message.getBody());
System.out.println("接收到消息:"+received);
};
channel.basicConsume("hello",true,deliverCallback,consumerTag -> {
System.out.println("消费者无法消费消息时调用,如队列被删除");
});
}
}
结果
- 先启动生产者,然后启动消费者,发现
info5
被最先消费 - 如果先启动消费者,再启动生产者,由于处理速度足够快,队列中没有消息堆积,所以按照顺序执行
惰性队列
惰性队列会尽可能的将消息存入磁盘中,而在消费者消费到相应的消息时才会被加载到内存中,它的一个重要的设计目标是能够支持更长的队列,即支持更多的消息存储
当消息由于各种各样的原因而致使长时间不能消费消息造成堆积时,惰性队列就很有必要了
队列具备两种模式:default和lazy。可以使用x-queue-mode
来设置队列的模式,取值为default
和lazy
。
惰性队列的声明
Map<String,Object> params = new HashMap();
params.put("x-queue-mode","lazy");
channel.queueDeclare("hello",false,false,false,params);