【消息队列】延迟消息

延迟消息

生产者发送消息时指定一个时间,消费者不会立刻收到消息,而在指定时间之后才收到消息

比如说演唱会的票,抢上了但是迟迟未支付,但是库存已经占用,就需要用到延迟消息

使用延时消息,但我们抢到票后发送消息到消息队列中,这时消息延时,假定30分钟,等到30分钟之后消息到达交易服务,如果这时还没有支付,就将这个服务挂掉

如何实现延时消息:

死信交换机

当一个队列中的消息满足下列情况之一,就会成为死信(dead letter):

  1. 消费者使用basic.reject或basic.nack声明消费失败,并且消息的requeue参数设置为false(设置消息不重新排队)
  2. 消息是一个过期消息(到达队列或消息本身设置的过期时间),超时无人消费
  3. 要投递的队列消息堆积满了,最早的消息可能成为死信

如果队列通过dead-letter-exchange属性指定了一个交换机,那么该队列中的死信就会投递到这个交换机中,这个交换机称为死信交换机(DLX)
在这里插入图片描述

延迟消息的插件

RabbitMQ的官方也推出了一个插件,原生支持延迟消息功能。该插件的原理是设计了一种支持延迟消息功能的交换机当消息投递到交换机后可以暂存一定时间,到期后再投递到队列。

安装 rabbitmq-delayed-message-exchange插件

配置延迟交换机:
第一种:注解配置

@RabbitListener(bindings=@QueueBinding(
                value=@Queue(name="delay.queue",durable="true"),
                exchange=@Exchange(name="delay.direct",delayed="true"),
                key="delay"))

第二种:配置设置

@Bean
public DirectExchange delayExchange(){
    return ExchangeBuilder
            .directExchange("delay.direct")
            .delayed() //设置属性为true
            .durable(true)
            .build();
}

如何发送延迟消息:通过消息头x-delay来设置过期时间:

@Test
void test(){
   String message="hello";
   rabbitTemplate.convertAndSend("delay.direct","delay",message,new MessagePostProcessor(){
   @Override
   public Message postProcessMessage(Message message) throws Exception{
        message.getMessageProperties().setDelay(5000);
        return message;
   }
   })
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值