RabbitMQ使用场景练习:优先级队列(十)

  • 优先级队列
      只有当消费者不足,不能及时进行消费的情况下,优先级队列才会生效  

     RabbitMQ3.5以后已经集成了rabbitmq_priority_queue 
引用


验证方式: 触发为及时消费场景 ,常用场景与Qos结合使用 
1、可先发送消息,再进行消费 
2、开启手动应答、设置Qos。若为1,在一个消费者存在的情况下,除第一个消息外均按优先级进行消费(第一个消息被及时消费掉了) 
3、可在方式二的基础上不断增加消费者,也符合优先调用规则 

  • 注意要点

为消息设置优先级别
Java代码   收藏代码
  1. //随机设置消息优先级  
  2. Builder properties=new BasicProperties.Builder();  
  3. int priority=new Random().nextInt(10);  
  4. properties.priority(priority);//建议0~255,超过貌似也没问题  
  5. channel.basicPublish(exchange_name, "", properties.build(), SerializationUtils.serialize(_mes));  

为队列创建优先级别
Java代码   收藏代码
  1. //设置队列的优先级,消息的优先级大于队列的优先级,以较小值为准(例如:队列优先级5、消息优先级8,消息实际优先级为5)  
  2. Map<String, Object> args=new HashMap<String, Object>();  
  3. args.put("x-max-priority"10);//队列优先级只能声明一次,不可改变(涉及到硬盘、内存存储方式)  
  4. channel.queueDeclare(queueName, falsefalsefalse, args);  


队列、消息上均要设置优先级才可生效,以较小值为准  

队列优先级只能声明一次,不可改变(涉及到硬盘、内存存储方式)  

优先级队列在内存、硬盘、cpu会有成本消耗,不建议创建大量的优先级别(数量、级别种类、大级别,理解混乱,英文理解困难...)  

  • 优先队列测试消息发送类

Java代码   收藏代码
  1. package com.demo.mq.rabbitmq.example10;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.Serializable;  
  5. import java.util.Random;  
  6. import java.util.concurrent.TimeoutException;  
  7.   
  8. import org.apache.commons.lang3.SerializationUtils;  
  9.   
  10. import com.demo.mq.rabbitmq.MqManager;  
  11. import com.rabbitmq.client.AMQP.BasicProperties;  
  12. import com.rabbitmq.client.AMQP.BasicProperties.Builder;  
  13. import com.rabbitmq.client.BuiltinExchangeType;  
  14. import com.rabbitmq.client.Channel;  
  15. import com.rabbitmq.client.Connection;  
  16.   
  17. /** 
  18.  * 优先队列测试消息发送类 
  19.  * @author sheungxin 
  20.  * 
  21.  */  
  22. public class PrioritySend {  
  23.     private static String exchange_name="priority_direct";  
  24.       
  25.     public static void prioritySend(Serializable mes) throws IOException, TimeoutException{  
  26.         Connection conn=MqManager.newConnection();  
  27.         Channel channel=conn.createChannel();  
  28.         channel.exchangeDeclare(exchange_name, BuiltinExchangeType.DIRECT);  
  29.         //发送10条消息  
  30.         for(int i=0;i<10;i++){  
  31.             //随机设置消息优先级  
  32.             Builder properties=new BasicProperties.Builder();  
  33.             int priority=new Random().nextInt(10);  
  34.             properties.priority(priority);//建议0~255,超过貌似也没问题  
  35.             String _mes=mes.toString()+i;  
  36.             channel.basicPublish(exchange_name, "", properties.build(), SerializationUtils.serialize(_mes));  
  37.             System.out.println(priority+" "+_mes);  
  38.         }  
  39.         channel.close();  
  40.         conn.close();  
  41.     }  
  42.       
  43.     public static void main(String[] args) throws IOException, TimeoutException {  
  44.         prioritySend("priority send:hello world!");  
  45.     }  
  46.   
  47. }  

  • 优先队列测试消息接收类

Java代码   收藏代码
  1. package com.demo.mq.rabbitmq.example10;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.HashMap;  
  5. import java.util.Map;  
  6. import java.util.concurrent.TimeoutException;  
  7. import org.apache.commons.lang3.SerializationUtils;  
  8. import com.demo.mq.rabbitmq.MqManager;  
  9. import com.rabbitmq.client.AMQP;  
  10. import com.rabbitmq.client.BuiltinExchangeType;  
  11. import com.rabbitmq.client.Channel;  
  12. import com.rabbitmq.client.Connection;  
  13. import com.rabbitmq.client.DefaultConsumer;  
  14. import com.rabbitmq.client.Envelope;  
  15.   
  16. public class PriorityRecv {  
  17.     private static String exchange_name="priority_direct";  
  18.     private static String queueName="priority_queue";  
  19.       
  20.     /** 
  21.      * 只有当消费者不足,不能及时进行消费的情况下,优先级队列才会生效 
  22.      * 验证方式: 
  23.      * 1、可先发送消息,再进行消费 
  24.      * 2、开启手动应答、设置Qos。若为1,在一个消费者存在的情况下,除第一个消息为均按优先级进行消费(第一个消息被及时消费掉了) 
  25.      * 3、可在方式二的基础上不断增加消费者,也符合优先调用规则 
  26.      * 注意要点: 
  27.      * 1、队列、消息上均要设置优先级才可生效,以较小值为准; 
  28.      * 2、队列优先级只能声明一次,不可改变(涉及到硬盘、内存存储方式) 
  29.      * 3、优先级队列在内存、硬盘、cpu会有成本消耗,不建议创建大量的优先级别(数量、级别种类、大级别,理解混乱,英文理解困难...) 
  30.      * @throws IOException 
  31.      * @throws TimeoutException 
  32.      */  
  33.     public static void priorityRecv() throws IOException, TimeoutException{  
  34.         Connection conn=MqManager.newConnection();  
  35.         Channel channel=conn.createChannel();  
  36.         channel.exchangeDeclare(exchange_name, BuiltinExchangeType.DIRECT);  
  37.         //设置队列的优先级,消息的优先级大于队列的优先级,以较小值为准(例如:队列优先级5、消息优先级8,消息实际优先级为5)  
  38.         Map<String, Object> args=new HashMap<String, Object>();  
  39.         args.put("x-max-priority"10);//队列优先级只能声明一次,不可改变(涉及到硬盘、内存存储方式)  
  40.         channel.queueDeclare(queueName, falsefalsefalse, args);  
  41.         channel.queueBind(queueName, exchange_name, "");  
  42.         channel.basicQos(1);//需要开启手动应答模式,否则无效  
  43.         channel.basicConsume(queueName, falsenew DefaultConsumer(channel){  
  44.             @Override  
  45.             public void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body) throws IOException{  
  46.                 String mes=SerializationUtils.deserialize(body);  
  47.                 System.out.println(properties.getPriority()+":priority Received :'"+mes+"' done");    
  48.                 channel.basicAck(envelope.getDeliveryTag(), false);  
  49.             }  
  50.         });  
  51.     }  
  52.       
  53.     public static void main(String[] args) throws IOException, TimeoutException {  
  54.         priorityRecv();  
  55.     }  
  56.   
  57. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值