阅读量:0
1.消息存活时间
可以对单个消息或者对整个队列设置过期时间,当消息到达存活时间还没有被消费,就会被队列移除。
有消息过期时间的队列可以在UI界面上看到
设置队列所有消息过期时间
@Bean("queue") public Queue getQueue() { return QueueBuilder.ttl(10000).build(); // 队列的每条消息保存10s }
设置单条消息存活时间
MessageProperties messageProperties = new MessageProperties(); messageProperties.setExpiration("6000"); // 6s Message message = new Message("test1".getBytes(StandardCharsets.UTF_8), messageProperties); rabbitTemplate.convertAndSend("test1", "testchange",message);
如果队列和消息同时设置过期时间,以时间短的为准。
2.消息优先级
RabbitMQ 自 V3.5.0有优先级队列的实现
消息设置优先级后,优先级越高,消息越早被消费。
优先级0-255之间,建议0-10
每个队列的优先级存在一些内存中和磁盘上的成本,还有额外的 CPU 成本,尤其是在使用时,因此可能不希望创建大量级别。
创建优先级队列
QueueBuilder.maxPriority(10) .build();
创建优先级消息
MessageProperties messageProperties = new MessageProperties(); messageProperties.setExpiration("5000"); // 5s messageProperties.setPriority(10); // 设置消息的优先级 Message message = new Message("topic_exchange_message".getBytes(StandardCharsets.UTF_8), messageProperties);
优先级只有在消息堆积的时候生效,如果消费者处理消息效率特别高,则可能不生效
3.死信队列
当消息成为无法被消费的消息时,会成为死信,进而进入死信队列。
死信队列,死信交换机和普通的交换机 队列没有区别。
消息成为死信的情况:
- 队列消息长度到达限制。
- 消费者拒签消息,并且不把消息重新放入原队列。
- 消息到达存活时间未被消费。
主要操作方式为1.创建死信交换机,创建死信队列 2.普通队列出了需要绑定交换机外,还需要绑定死信交换机和死信路由关键字
QueueBuilder .durable(NORMAL_QUEUE) .deadLetterExchange(DEAD_EXCHANGE) // 绑定死信交换机 .deadLetterRoutingKey("dead_routing") // 死信队列路由关键字 .ttl(10000) // 消息存活10s .maxLength(10) // 队列最大长度为10 .build();
4.延迟队列
使用死信队列实现延迟队列
缺点:消息不会立马执行
一般很少使用这个实现
可以使用插件实现延迟队列
地址:Community Plugins | RabbitMQ
将rabbitmq_delayed_message_exchange上传指定目录下使用unzip解压即可
安装目录: /rabbitmq/plugins
执行
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
如果使用的时docker
docker cp rabbitmq_delayed_message_exchange-3.9.0.ez 095a83361bf9:/plugins
进入容器操作
docker exec -it 你的RabbitMQ名称或容器id /bin/bash
启动插件
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
最后在控制台查看 如果出现了 x-delayed-message则说明插件安装成功
代码应用
message.getMessageProperties().setDelay(15000);
至此rabbitmq入门成功