RabbitMQ之队列优先级
来源:互联网 发布:虎牙象棋勇哥是软件 编辑:程序博客网 时间:2024/05/20 03:08
优先级队列,顾名思义,具有更高优先级的队列具有较高的优先权,优先级高的消息具备优先被消费的特权。
本文主要讲解如何使用RabbitMQ实现队列优先级。
可以通过RabbitMQ管理界面配置队列的优先级属性,如下图的x-max-priority.
也可以通过代码去实现,比如:
Map<String,Object> args = new HashMap<String,Object>();args.put("x-max-priority", 10);channel.queueDeclare("queue_priority", true, false, false, args);
配置了队列优先级的属性之后,可以在管理页面看到Pri的标记:
上面配置的是一个队列queue的最大优先级。之后要在发送的消息中设置消息本身的优先级,如下:
AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();builder.priority(5);AMQP.BasicProperties properties = builder.build();channel.basicPublish("exchange_priority","rk_priority",properties,("messages").getBytes());
下面演示一段生产-消费的代码。首先producer端先生产10个消息,第奇数个消息具备优先级,第偶数个消息就是默认的优先级(最低:0)。
生产端:
package com.vms.test.zzh.rabbitmq.priority;import com.rabbitmq.client.AMQP;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;import java.util.HashMap;import java.util.Map;import java.util.concurrent.TimeoutException;/** * Created by hidden on 2017/2/14. */public class PriorityProducer { public static final String ip = "10.198.197.73"; public static final int port = 5672; public static final String username = "root"; public static final String password = "root"; public static void main(String[] arggs) throws IOException, TimeoutException { ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setPassword(password); connectionFactory.setUsername(username); connectionFactory.setPort(port); connectionFactory.setHost(ip); Connection connection = connectionFactory.newConnection(); Channel channel = connection.createChannel(); //create exchange channel.exchangeDeclare("exchange_priority","direct",true); //create queue with priority Map<String,Object> args = new HashMap<String,Object>(); args.put("x-max-priority", 10); channel.queueDeclare("queue_priority", true, false, false, args); channel.queueBind("queue_priority", "exchange_priority", "rk_priority"); //send message with priority for(int i=0;i<10;i++) { AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder(); if(i%2!=0) builder.priority(5); AMQP.BasicProperties properties = builder.build(); channel.basicPublish("exchange_priority","rk_priority",properties,("messages-"+i).getBytes()); } channel.close(); connection.close(); }}
消费端:
package com.vms.test.zzh.rabbitmq.priority;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;import com.rabbitmq.client.QueueingConsumer;import java.io.IOException;import java.util.concurrent.TimeoutException;/** * Created by hidden on 2017/2/14. */public class PriorityConsumer { public static final String ip = "10.198.197.73"; public static final int port = 5672; public static final String username = "root"; public static final String password = "root"; public static void main(String[] args) throws IOException, TimeoutException, InterruptedException { ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setPassword(password); connectionFactory.setUsername(username); connectionFactory.setPort(port); connectionFactory.setHost(ip); Connection connection = connectionFactory.newConnection(); Channel channel = connection.createChannel(); QueueingConsumer consumer = new QueueingConsumer(channel); channel.basicConsume("queue_priority", false, consumer); while (true) { QueueingConsumer.Delivery delivery = consumer.nextDelivery(); String msg = new String(delivery.getBody()); System.out.println(msg); channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false); } }}
消费端运行结果:
messages-1messages-3messages-5messages-7messages-9messages-0messages-2messages-4messages-6messages-8
查看运行结果可以验证优先级队列的作用。
当然,在消费端速度大于生产端速度,且broker中没有消息堆积的话,对发送的消息设置优先级也没什么实际意义,因为发送端刚发送完一条消息就被消费端消费了,那么就相当于broker至多只有一条消息,那么对于单条消息来说优先级是没有什么意义的。
0 0
- RabbitMQ之队列优先级
- 如何基于RabbitMQ实现优先级队列
- 如何基于RabbitMQ实现优先级队列
- 如何基于RabbitMQ实现优先级队列
- 如何基于RabbitMQ实现优先级队列
- 如何基于RabbitMQ实现优先级队列
- 如何基于RabbitMQ实现优先级队列
- rabbitmq结合spring实现消息队列优先级
- RabbitMQ使用场景练习:优先级队列(十)
- 体验Rabbitmq强大的【优先级队列】之轻松面对现实业务场景
- 体验Rabbitmq强大的【优先级队列】之轻松面对现实业务场景
- RabbitMQ之工作队列
- RabbitMQ之死信队列
- 队列工厂之RabbitMQ
- RabbitMQ之队列
- 算法之优先级队列
- C++ 之优先级队列
- 数据结构之优先级队列
- Java HashTable HashMap ConcurrentHashMap 对比选择
- [mmc subsystem] mmc core(第二章)——数据结构和宏定义说明
- Codeforces Round #397(Div. 1 + Div. 2 combined)D. Artsem and Saunders【思维+乱搞】
- 终端使用别名记住登录ssh的ip登录
- JavaWeb起航篇:web通信原理
- RabbitMQ之队列优先级
- PAT甲级1109
- Log4J
- 石子合并 (区间dp)
- Access/Modify/Change时间
- Android_通知Notificaition
- [mmc subsystem] mmc core(第六章)——mmc core主模块
- 数据结构实验之栈:行编辑器
- org.hibernate.MappingException: must specify an identifier type: