12.优先级队列和惰性队列

优先级队列

如何添加优先级

在这里插入图片描述

  • 选择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来设置队列的模式,取值为defaultlazy

惰性队列的声明

Map<String,Object> params = new HashMap();
params.put("x-queue-mode","lazy");
channel.queueDeclare("hello",false,false,false,params);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值