rabbitmq 优先级队列

前言

首先什么是优先级队列呢?优先级队列是指优先级高的消息往往放在队列的head头部,相比低优先级的消息,要优先投递给消费者进行处理。接下来,将介绍在rabbitmq中如何实现优先级队列。

具体使用

版本要求:rabbitmq 3.5.0以上

  1. 定义优先级队列

    Channel ch = ...;
    Map<String, Object> args = new HashMap<String, Object>();
    args.put("x-max-priority", 10); // 定义队列的最大优先级值
    ch.queueDeclare("my-priority-queue", true, false, false, args);

    或者通过后台管理界面定义 

 

2,发送优先级消息

消息的优先级取值范围是无符号byte[0, 255],当消息没有设置优先级时,则以最低优先级0对待;当消息的优先级大于queue中设置的最大优先级时,则以queue中设置的最大优先级对待;对于相同优先级的消息,先进的排在前面,后进的排在后面。

AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
builder.priority(5); //设置消息优先级为5
AMQP.BasicProperties properties = builder.build();
channel.basicPublish("my-priority-exchange","my-priority-queue-key", properties, "nop".getBytes());

示例代码 

public static void main(String[] args) throws IOException {
    ConnectionFactory connectionFactory = new ConnectionFactory();
    connectionFactory.setHost("127.0.0.1");
    connectionFactory.setPort(5672);
    connectionFactory.setUsername("test");
    connectionFactory.setPassword("1234");
    connectionFactory.setVirtualHost("/test");
    connectionFactory.setAutomaticRecoveryEnabled(true);
    Connection conn = connectionFactory.newConnection();
    final Channel channel = conn.createChannel();

    // 创建消费者
    channel.basicQos(1);
    final CountDownLatch latch = new CountDownLatch(1);
    channel.basicConsume("my-priority-queue", new DefaultConsumer(channel) {
        @Override
        public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
            byte[] body) throws IOException {
            System.out.println(new String(body, "utf-8"));
            try {
               // 等待下面的生产者将所有消息投递到queue,在返回给第一个消息确认回复
                latch.await();
            } catch (InterruptedException e){} 
            channel.basicAck(envelope.getDeliveryTag(), false); // 确认消息已收到
        }
    });

    // 投递优先级消息
    String msg = "msg-priority-";
    AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
    for (int i = 0; i < 20;)
    {
        builder.priority(i); // 设置消息优先级为i
        AMQP.BasicProperties properties = builder.build();
        channel.basicPublish("my-priority-exchange", "my-priority-queue-key", properties, (msg + i).getBytes());
        i = i + 2;
    }
    // 通知消费者继续消费queue中的消息
    latch.countDown();
}

 

:要看到优先级队列的效果,必须要保证queue中同时存在不同优先级的消息且消费者处于忙碌状态。

应用场景

  1. 各业务系统投递给短信平台的短信,通常是由优先级之分的,比如短信验证码这一类的就要求及时性,需要短信平台那边优先处理 ——属于紧急重要;有些通知类的短信就不需要那么高的及时性,可以稍后处理等。
  2. ……

 

转载自    http://www.pandan.xyz/2017/03/12/rabbitmq%20优先级队列/

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值