天天看点

Rabbit 高级操作

Rabbit 高级操作

过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取;过了时间之后消息将自动被删除。

RabbitMQ可以对消息和队列设置TTL。目前有两种方法可以设置。

第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。

第二种方法是对消息进行单独设置,每条消息TTL可以不同。

如果上述两种方法同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。消息在队列的生存时间一旦超过设置的TTL值,就称为dead message被投递到死信队列, 消费者将无法再收到该消息。

运行之后,可以进入网站中查看该队列:

刚运行时:

Rabbit 高级操作

运行6s后:

Rabbit 高级操作

这样可以给这条​<code>​message​</code>​ 设置过期时间,如果上述两种方法同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。所以会 ​<code>​5s​</code>​ 过期。

DLX,全称为Dead-Letter-Exchange , 可以称之为死信交换机,也有人称之为死信邮箱。当消息在一个队列中变成死信(dead message)之后,它能被重新发送到另一个交换机中,这个交换机就是DLX ,绑定DLX的队列就称之为死信队列。

消息变成死信,可能是由于以下的原因:

消息被拒绝

消息过期

队列达到最大长度

DLX也是一个正常的交换机,和一般的交换机没有区别,它能在任何的队列上被指定,实际上就是设置某一个队列的属性。当这个队列中存在死信时,Rabbitmq就会自动地将这个消息重新发布到设置的DLX上去,进而被路由到另一个队列,即死信队列。

要想使用死信队列,只需要在定义队列的时候设置队列参数 ​<code>​x-dead-letter-exchange​</code>​ 指定交换机即可。

Rabbit 高级操作

6s之后:

Rabbit 高级操作

发送了三条信息,而设置的消息队列长度为​<code>​2​</code>​,这样最先发送的​<code>​第1个消息​</code>​会进入死信队列:

Rabbit 高级操作
Rabbit 高级操作

延迟队列存储的对象是对应的延迟消息;所谓“延迟消息” 是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。在RabbitMQ中延迟队列可以通过 ​<code>​过期时间​</code>​ + ​<code>​死信队列​</code>​ 来实现;

先启动 ​<code>​消费者​</code>​ ,开启监听,在启动 ​<code>​生产者​</code>​ 发送消息。

这时候可能出现错误:

Rabbit 高级操作
这个问题是因为你创建的交换机已经存在,可以去rabbitmq网站中,删除对应交换机。

再次运行就成功了:

Rabbit 高级操作
Rabbit 高级操作