安装:

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配置文件:

springboot rabbitMq新增队列_运维

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

springboot rabbitMq新增队列_运维_02

 

创建交换器

springboot rabbitMq新增队列_大数据_03

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

 

springboot rabbitMq新增队列_docker_04

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

 

springboot rabbitMq新增队列_docker_05

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

springboot rabbitMq新增队列_java_06

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

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

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

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

springboot rabbitMq新增队列_运维_07

 

 

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

交换器:

  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);