美文网首页一些收藏
rabbitmq过期时间和死信队列

rabbitmq过期时间和死信队列

作者: 念䋛 | 来源:发表于2021-10-11 21:55 被阅读0次

消息的过期时间
消息的过期时间一共两种方式,一种是队列本身的过期时间一种是消息的本身的过期时间,
如果过期时间的消息放在有过期时间的队列中,以时间短的时间为准

  1. 创建过期时间的队列 expires(1000000) 单位是毫秒,操过时间队列就会被删除
/**
 * 过期时间的消息队列,并且绑定了死信队列
 */
@Bean("bootQueueTTL")
public Queue bootQueueTTL() {
    return QueueBuilder.durable (QUEUE_NAME_TTL).expires (1000000).deadLetterExchange (EXCHANGE_NAME_DLK).deadLetterRoutingKey ("springbootttl.#").build ();
}

  1. 创建过期的消息 setExpiration(“10000”) 设置消息的过期时间
MessagePostProcessor messagePostProcessor = new MessagePostProcessor () {
    @Override
    public Message postProcessMessage(Message message) throws AmqpException {
        MessageProperties messageProperties = message.getMessageProperties ();
        messageProperties.setExpiration ("10000");
        return message;
    }
};
//直接发送消息
rabbitTemplate.convertAndSend ("spirngboot_queue_topic_exchange", "springboot.HelloRabbitMq", "HelloRabbitMq", messagePostProcessor);

死信队列
当一个队列中的消息变成死信之后,会被重新发送到一个新交换机中,这个交换机就是死信交换机DLK,绑定的队列就是死信队列
成为死信的的几种情况
消息被拒绝,并且没有重新放到队列中
消息过期
队列达到最大长度,不能再放进消息.

死信交换机和死信队列完全是一个普通的交换机和队列


image.png

图中springboot_quere_dlk是死信队列,但是只有D标识,代表是持久化,而springboot_queue
有DLK和DLX标识,当springboot_queue队列中的消息过期或者被拒绝之后,丢弃的消息就会到死信交换机中,发到与交换机绑定的队列中,让消费者消费
下面看一下springboot初始化死信队列和交换机

/**
 * 创建一个死信队列消息队列
 */
@Bean("bootQueueDLK")
public Queue bootQueueDLK() {
    return QueueBuilder.durable (QUEUE_NAME_DLK).build ();
}
/**
 * 声明队列
 */
@Bean("bootQueue")
public Queue bootQueue() {
    //指定队列的同时也指定了队列的最大优先级,发送消息的时候也要指定消息的优先级,rabbitmq 的管理页面的queue会有一个pri的标识
    //指定了该队列如果出现死信,将这些消息发送到哪个死信交换机中,并指定了消息发送到交换机的时候,携带的路由key
    return QueueBuilder.durable (QUEUE_NAME).maxPriority (5).deadLetterExchange (EXCHANGE_NAME_DLK).deadLetterRoutingKey ("springboot.#").build ();
}

/**
 * 队列与交换机进行绑定
 */
@Bean
public Binding bindQueueExchange(@Qualifier("bootQueue") Queue queue, @Qualifier("bootExchange") Exchange exchange) {
    return BindingBuilder.bind (queue).to (exchange).with ("springboot.#").noargs ();
}

/**
 * 死信队列和交换机的绑定
 */
@Bean
public Binding bindQueueExchangeDLK(@Qualifier("bootQueueDLK") Queue queue, @Qualifier("bootExchangeDLK") Exchange exchange) {
    return BindingBuilder.bind (queue).to (exchange).with ("springboot.#").noargs ();
}

image.png

那么我们就可以用TTL+死信队列的方式实现延时队列,发送消息的时候将消息设置过期时间,等到过期时间一到,消息就会发送到死信队列中,这个时候消费者消费死信队列中的消息,就实现了延时队列.

相关文章

网友评论

    本文标题:rabbitmq过期时间和死信队列

    本文链接:https://www.haomeiwen.com/subject/mpyroltx.html