9.优先级队列
9.1使用场景
在我们系统中有一个订单催付的场景,我们的客户在天猫下的订单,淘宝会及时将订单推送给我们,如果在用户设定的时间内未付款那么就会给用户推送一条短信提醒,很简单的一个功能对吧,但是,tmall商家对我们来说,肯定是要分大客户和小客户的对吧,比如像苹果,小米这样大商家一年起码能给我们创造很大的利润,所以理应当然,他们的订单必须得到优先处理,而曾经我们的后端系统是使用 redis 来存放的定时轮询,大家都知道 redis 只能用 List 做一个简简单单的消息队列,并不能实现一个优先级的场景,所以订单量大了后采用 RabbitMQ 进行改造和优化,如果发现是大客户的订单给一个相对比较高的优先级,否则就是默认优先级。范围1~255。
9.2添加方式
9.2.1控制台页面添加
9.2.2队列中代码添加优先级
Map<String, Object> params = new HashMap(); params.put("x-max-priority", 10); channel.queueDeclare("hello", true, false, false, params);
9.2.3消息中代码添加优先级
// 设置本条消息的优先级为.priority(5) AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().priority(5).build();
注意事项
要让队列实现优先级需要做的事情有如下:
队列需要设置为优先级队列,
消息需要设置消息的优先级,
消费者需要等待消息已经发送到队列中才去消费,
因为,这样才有机会对消息进行排序
消息生产者
public class Producer3 { private static final String QUEUE_NAME = "hello"; public static void main(String[] args) throws Exception { try (Channel channel = RabbitMqUtil.getChannel()) { // 给消息赋予一个 priority 属性,设置优先级为5 AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().priority(5).build(); for (int i = 1; i < 11; i++) { String message = "info" + i; // i=5设置优先级为5,其他消息未设置优先级 if (i == 5) { channel.basicPublish("", QUEUE_NAME, properties, message.getBytes()); } else { channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); } System.out.println("发送消息完成:" + message); } } } }
消息消费者
public class Consumer { private static final String QUEUE_NAME = "hello"; public static void main(String[] args) throws Exception { Channel channel = RabbitMqUtil.getChannel(); // 设置队列的最大优先级 最大可以设置到 255 官网推荐 1-10 如果设置太高比较吃内存和 CPU Map<String, Object> params = new HashMap(); params.put("x-max-priority", 10); channel.queueDeclare(QUEUE_NAME, true, false, false, params); System.out.println("消费者启动等待消费......"); DeliverCallback deliverCallback = (consumerTag, delivery) -> { String receivedMessage = new String(delivery.getBody()); System.out.println("接收到消息:" + receivedMessage); }; channel.basicConsume(QUEUE_NAME, true, deliverCallback, (consumerTag) -> { System.out.println("消费者无法消费消息时调用,如队列被删除"); }); } }
本文来自博客园,作者:Lz_蚂蚱,转载请注明原文链接:https://www.cnblogs.com/leizia/p/16063646.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步