rabbitmq的优先级队列

在我们系统中有一个 订单催付 的场景,我们的客户在天猫下的订单 , 淘宝会及时将订单推送给我们,如果在用户设定的时间内未付款那么就会给用户推送一条短信提醒,很简单的一个功能对吧,但是,tianmao商家对我们来说,肯定是要分大客户和小客户的对吧,比如像苹果,小米这样大商家一年起码能给我们创造很大的利润,所以理应当然,他们的订单必须得到优先处理,而曾经我们的后端系统是使用 redis 来存放的定时轮询,大家都知道 redis 只能用 List 做一个简简单单的消息队列,并不能实现一个优先级的场景, 所以订单量大了后采用 RabbitMQ 进行改造和优化 , 如果发现是大客户的订单给一个相对比较高的优先级,否则就是默认优先级。

添加队列

控制台添加

代码添加优先级

java 复制代码
Map<String, Object> params = new HashMap();
params.put("x-max-priority", 10);
channel.queueDeclare("hello", true, false, false, params);

消息中代码添加优先级

java 复制代码
AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().priority(5).build();

注意事项

要让队列实现优先级需要做的事情有如下事情 : 队列需要设置为优先级队列,消息需要设置消息的优先级,消费者需要等待消息已经发送到队列中才去消费,因为这样才有机会对消息进行排序

代码

工具类

java 复制代码
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
 
public class RabbitMqUtils {
     //得到一个连接的 channel
     public static Channel getChannel() throws Exception{
         //创建一个连接工厂
         ConnectionFactory factory = new ConnectionFactory();
         factory.setHost("43.139.59.28");
         factory.setUsername("guest");
         factory.setPassword("guest");
         Connection connection = factory.newConnection();
         Channel channel = connection.createChannel();
         return channel;
     }
}

生产者

java 复制代码
import com.example.demo.util.RabbitMqUtils;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;

public class Producer {
   private static final String QUEUE_NAME="hello";
    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("发送消息完成:" + message);
           }
        }
    }
}

生产者

java 复制代码
import com.example.demo.util.RabbitMqUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

import java.util.HashMap;
import java.util.Map;

public class Consumer {
  private static final String QUEUE_NAME="hello";
  public static void main(String[] args) throws Exception {
      Channel channel = RabbitMqUtils.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("消费者无法消费消息时调用,如队列被删除");
      });
  }
}

结果

i==5的消息被设置优先级为5,所以消息被最先消费

相关推荐
真上帝的左手12 小时前
30. 技术专题-‌应用框架组件-搜索引擎-ES
大数据·分布式·elasticsearch·搜索引擎·中间件
8Qi81 天前
DDD架构演进
java·分布式·mvc·ddd
方方洛1 天前
ray教程-23-附录C-术语表
人工智能·分布式·机器学习
海棠Flower未眠1 天前
下单请求处理流程:商品维度分布式锁与 Redis 预扣库存
redis·分布式·junit
罗四强1 天前
第10篇:打包上架:签名、打包 HAP、发布到华为应用市场
分布式·操作系统·harmonyos·arkts·鸿蒙系统
秋饼1 天前
Redis 全面解析:从数据结构到主从/哨兵/集群、分布式锁与面试高频考点,代码到原理一次讲透
数据库·redis·分布式·面试·后端开发
二月夜1 天前
Redis 高频面试题全解:缓存三大问题、大 key 治理与分布式锁之争(2026 招聘 JD 真题复盘)
redis·分布式·后端·缓存
后台模板学习1 天前
Kafka 与 RabbitMQ 在用户认证与权限管理场景
kafka·rabbitmq·linq
樱花落木兰1 天前
Redis 消息队列的可靠性演进:从 List、Pub/Sub 到 Stream 消费者组,以及 8.x 版本改变了什么
java·开发语言·经验分享·redis·分布式·python·软件工程
真上帝的左手2 天前
12. 消息队列-Kafka进阶
分布式·中间件·kafka