RabbitMq(1)springboot集成,实现延迟队列

安装:

docker 启动命令

下载镜像:docker pull rabbitmq:3.7.7-management

docker run -d --name rabbitmq3.7.7 -p 5672:5672 -p 15672:15672 -v `pwd`/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost  -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin df80af9ca0c9

 

RabbitMq 实现延迟队列:

 

MabbitMq是没有延迟队列的功能的,但使用RabbitMq的两个特性可以帮助我们实现这个功能;

 

      TTL(Time-To-Live Extensions)

    RabbitMq 运行我们为队列或者效期设置有效期;TTL表明了一条消息可在队列中存活的最大时间,单位为毫秒;

    如果既配置了消息的TTL,又配置了队列的TTL,那么较小的那个值会被取用。

      DLX(Dead Letter Exchange)

    设置了TTL的消息在过期后会成为Dead Letter,如果队列设置了Dead Letter Exchange(DLX),

    那么这些Dead Letter就会被重新publish到Dead Letter Exchange,通过Dead Letter Exchange路由到其他队列;

 

将RabbitMQ的TTL和DLX特性结合在一起,即可实现一个延迟队列。

延迟队列根据使用场景又可以分为以下两种:

延迟消费

延迟消费是延迟队列最为常用的使用模式。如下图所示,生产者产生的消息首先会进入缓冲队列。通过RabbitMQ提供的TTL扩展,这些消息会被设置过期时间,

也就是延迟消费的时间。等消息过期之后,这些消息会通过配置好的DLX转发到实际消费队列,以此达到延迟消费的效果。

延迟重试

延迟重试本质上也是延迟消费的一种,但是这种模式的结构与普通的延迟消费的流程图较为不同,所以单独拎出来介绍。

消费者发现该消息处理出现了异常,比如是因为网络波动引起的异常。那么如果不等待一段时间,直接就重试的话,很可能会导致在这期间内一直无法成功,

造成一定的资源浪费。那么我们可以将其先放在缓冲队列中,等消息经过一段的延迟时间后再次进入实际消费队列中,此时由于已经过了“较长”的时间了,

异常的一些波动通常已经恢复,这些消息可以被正常地消费。

 

springboot实现延迟消费代码:

配置application.yml配置文件:

创建一个配置类,创建交换器和和一个队列实现DLX,一个死信队列

 

创建交换器

 创建一个队列,启用DLX功能

 

创建一个普通队列,作为死信队列

 

最后进行队列与交换器的绑定,设置绑定的路由键

通过配置类,springBoot项目启动就连接RabbitMq创建我们要使用的交换器和队列,当项目重复启动时,RabbitMq已经有了我们要的交换器和队列时,RabbitMq不会再重新进行创建操作;

注意这里,RabbitMq不可以创建不同模式的同名交换器,或启用不同功能的同名队列;

//---------消费端 

消费RabbitMq消息,创建一个类并放入spring容器;使用注解@RabbitListener和@RabbitHandler实现;

 

 

 //------------------------------------------------------------------配置类创建交换器和队列的构造方法说明

交换器:

  1. // 参数1 name :交互器名  
  2. // 参数2 durable :是否持久化  
  3. // 参数3 autoDelete :当所有消费客户端连接断开后,是否自动删除队列  
  4. new TopicExchange(name, durable, autoDelete)  

队列:

  1. // 参数1 name :队列名  
  2. // 参数2 durable :是否持久化  
  3. // 参数3 exclusive :仅创建者可以使用的私有队列,断开后自动删除  
  4. // 参数4 autoDelete : 当所有消费客户端连接断开后,是否自动删除队列  
  5. new Queue(name, durable, exclusive, autoDelete);

 

转载于:https://www.cnblogs.com/codeLzm/p/11355476.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值