六、消息中间件RabbitMQ之队列的控制与消息的属性

控制队列

   /**
     * Declare a queue
     * @see com.rabbitmq.client.AMQP.Queue.Declare
     * @see com.rabbitmq.client.AMQP.Queue.DeclareOk
     * @param queue 队列名称
     * @param durable 临时队列(false)/永久队列(true)
     * @param exclusive 单消费者队列
     * @param autoDelete 自动删除队列
     * @param arguments 自定义属性这里需要new HashMap。例如设置队列的自动过期x-expires等属性
     * @return a declaration-confirm method to indicate the queue was successfully declared
     * @throws java.io.IOException if an error is encountered
     */
    Queue.DeclareOk queueDeclare(
    	String queue, 
    	boolean durable, 
    	boolean exclusive, 
    	boolean autoDelete,
    	Map<String, Object> arguments) throws IOException;

临时队列

durable属性如果是false就是临时队列。rabbitMQ在重启后如果是临时队列,数据会丢失。

自动删除队列

自动删除队列和普通队列在使用上没有什么区别,唯一的区别是,当消费者断开连接时,队列将会被删除。自动删除队列允许的消费者没有限制,也就是说当这个队列上最后一个消费者断开连接才会执行删除。
自动删除队列只需要在声明队列时,设置属性auto-delete标识为true即可。系统声明的随机队列,缺省就是自动删除的。

但消费者队列

普通队列允许的消费者没有限制,多个消费者绑定到多个队列时,RabbitMQ会采用轮询进行投递。如果需要消费者独占队列,在队列创建的时候,设定属性exclusive为true。

自动过期队列

指队列在超过一定时间没使用,会被从RabbitMQ中被删除。什么是没使用?
一定时间内没有Get操作发生
没有Consumer连接在队列上
特别的:就算一直有消息进入队列,也不算队列在被使用。
通过声明队列时,设定x-expires参数即可,单位毫秒。
就是设置arguments属性。这里需要创建一个HashMap里面需要put一个x-expires属性即可。
例如:

Map<String,Object> arguments = new HashMap<>();
arguments.put("x-expires",5000);

永久队列

持久化队列和非持久化队列的区别是,持久化队列会被保存在磁盘中,固定并持久的存储,当Rabbit服务重启后,该队列会保持原来的状态在RabbitMQ中被管理,而非持久化队列不会被保存在磁盘中,Rabbit服务重启后队列就会消失。
非持久化比持久化的优势就是,由于非持久化不需要保存在磁盘中,所以使用速度就比持久化队列快。即是非持久化的性能要高于持久化。而持久化的优点就是会一直存在,不会随服务的重启或服务器的宕机而消失。
在声明队列时,将属性durable设置为“false”,则该队列为非持久化队列,设置成“true”时,该队列就为持久化队列

队列级别消息过期

就是为每个队列设置消息的超时时间。只要给队列设置x-message-ttl 参数,就设定了该队列所有消息的存活时间,时间单位是毫秒。如果声明队列时指定了死信交换器,则过期消息会成为死信消息。
例如:

String queueName = "qName";
Map<String,Object> arguments = new HashMap<>();
arguments.put("x-expires",5000);
arguments.put("x-message-ttl",15000);
channel.queueDeclare(queueName,false,false,false,arguments);

消息属性

队列保留参数列表

参数名描述
x-dead-letter-exchange死信交换器
x-dead-letter-routing-key死信消息的可选路由键
x-expires队列在指定毫秒数后被删除
x-ha-policy创建HA队列
x-ha-nodesHA队列的分布节点
x-max-length队列的最大消息数
x-message-ttl毫秒为单位的消息过期时间,队列级别
x-max-priority最大优先值为255的队列优先排序功能

消息属性描述

属性名描述/用处
content-type消息体的MIME类型,如application/json
content-encoding消息的编码类型,如是否压缩
message-id消息的唯一性标识,由应用进行设置
correlation-id一般用做关联消息的message-id,常用于消息的响应
timestamp消息的创建时刻,整型,精确到秒
expiration消息的过期时刻,字符串,但是呈现格式为整型,紧缺到秒
delivery-model消息的持久化类型,1:非持久化,2:持久化,性能影响巨大
app-id应用程序的类型和版本号
user-id标识已登录用户,极少使用
type消息类型名称,完全由应用决定如何使用该字段
reply-to构建回复消息的私有响应队列
headers键值对表,用户自定义任意的键和值
priority指定队列中消息的优先级

消息的存活时间

当队列消息的TTL 和消息TTL都被设置,时间短的TTL设置生效。如果将一个过期消息发送给RabbitMQ,该消息不会路由到任何队列,而是直接丢弃。
为消息设置TTL有一个问题:RabbitMQ只对处于队头的消息判断是否过期(即不会扫描队列),所以,很可能队列中已存在死消息,但是队列并不知情。这会影响队列统计数据的正确性,妨碍队列及时释放资源。

消息的持久化

默认情况下,队列和交换器在服务器重启后都会消失,消息当然也是。将队列和交换器的durable属性设为true,缺省为false,但是消息要持久化还不够,还需要将消息在发布前,将投递模式设置为2。消息要持久化,必须要有持久化的队列、交换器和投递模式都为2。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值