SpringBoot: RabbitMQ延迟队列

  
  

<代码> SpringBoot> 春季> 自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个WEB工程

     

初探RabbitMQ消息队列中介绍了RabbitMQ <代码> 的简单用法,顺带提及了下延迟队列的作用。<强>所谓延时消息就是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费。

  

延迟队列

  
  

延迟队列能做什么?

     
      <李> <>强订单业务:在电商/点餐中,都有下单后30分钟内没有付款,就自动取消订单。   <李> <>强短信通知:下单成功后60年代之后给用户发送短信通知。   <李> <>强失败重试:强业务操作失败后,间隔一定的时间进行失败重试。   
  

这类业务的特点就是:非实时的,需要延迟处理,需要进行失败重试。一种比较笨的方式是采用定时任务,轮训数据库,方法简单好用,但性能底下,在高并发情况下容易弄死数据库,间隔时间不好设置,时间过大,影响精度,过小影响性能,而且做不到按超时的时间顺序处理。另一种就是用<强> Java中的DelayQueue位于Java . util . concurrent包下,本质是由PriorityQueue和BlockingQueue实现的阻塞优先级队列。强劲,这玩意最大的问题就是<强>不支持分布式与持久化

  

RabbitMQ实现思路

  

<代码> RabbitMQ队列>   

  

time - to - live扩展      

<强> RabbitMQ支持为队列或者消息设置TTL(时间活存活时间) .TTL表明了一条消息可在队列中存活的最大时间。当某条消息被设置了TTL或者当某条消息进入了设置了TTL的队列时,这条消息会在TTL时间后<强>死亡成为死信强。如果既配置了消息的TTL,又配置了队列的TTL,那么较小的那个值会被取用。

  
  

死信交换      

<强>死信交换机强,上文中提到设置了TTL的消息或队列最终会成为<代码>死信> 死信交换(DLX)> 死信> 死信交换中,然后通过<代码> 路死信交换由到其他队列,即可实现延迟队列的功能。

  

 SpringBoot: RabbitMQ延迟队列

  

导入依赖

  

在<代码>砰的一声。xml> spring-boot-starter-amqp>   

 <代码> & lt; dependencies>
  & lt; dependency>
  & lt; groupId> org.springframework.boot
  & lt; artifactId> spring-boot-starter-amqp
  & lt;/dependency>
  & lt; dependency>
  & lt; groupId> com.alibaba
  & lt; artifactId> fastjson
  & lt; version> 1.2.46
  & lt;/dependency>
  & lt; dependency>
  & lt; groupId> org.springframework.boot
  & lt; artifactId> spring-boot-starter-web
  & lt;/dependency>
  & lt; dependency>
  & lt; groupId> org.springframework.boot
  & lt; artifactId> spring-boot-starter-test
  & lt; scope> test
  & lt;/dependency>
  & lt;/dependencies>  
  

属性配置

  

在<代码>应用程序。属性> 相关内容,值得注意的是这里配置了手动ACK的开关

  
 <代码> spring.rabbitmq.username=battcn
  spring.rabbitmq.password=battcn
  spring.rabbitmq.host=192.168.0.133
  spring.rabbitmq.port=5672
  spring.rabbitmq.virtual-host=/#手动ACK不开启自动ACK模式,目的是防止报错后未正确处理消息丢失默认为没有
  spring.rabbitmq.listener.simple.acknowledge-mode=手册 
  

具体编码

  

定义队列

  

如果手动创建过或者RabbitMQ <代码> 中已经存在该队列那么也可以省略下述代码…

  
 <代码>包com.battcn.config;
  
  进口org.slf4j.Logger;
  进口org.slf4j.LoggerFactory;
  进口org.springframework.amqp.core。*;
  进口org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
  进口org.springframework.amqp.rabbit.core.RabbitTemplate;
  进口org.springframework.context.annotation.Bean;
  进口org.springframework.context.annotation.Configuration;
  
  进口java.util.HashMap;
  进口java.util.Map;/* *
  * RabbitMQ配置
  *
  * @author莱文
  * @since 2018/4/11 0011
  */@ configuration
  公开课RabbitConfig {
  
  私有静态最终记录器日志=LoggerFactory.getLogger (RabbitConfig.class);
  
  @ bean
  公共RabbitTemplate RabbitTemplate (CachingConnectionFactory connectionFactory) {
  connectionFactory.setPublisherConfirms(真正的);
  connectionFactory.setPublisherReturns(真正的);
  RabbitTemplate RabbitTemplate=new RabbitTemplate (connectionFactory);
  rabbitTemplate.setMandatory(真正的);
  rabbitTemplate。setConfirmCallback ((correlationData, ack,造成)→log.info(“消息发送成功:correlationData({}),应答({}),因为({})”,correlationData ack,引起));
  rabbitTemplate。setReturnCallback(消息、replyCode replyText、交换、routingKey)→log.info(“消息丢失:交换({}),路线({}),replyCode ({}), replyText({}),信息:{}”,交换,routingKey, replyCode, replyText,消息));
  返回rabbitTemplate;
  }/* *
  *延迟队列TTL名称
  */私有静态最终字符串REGISTER_DELAY_QUEUE=癲ev.book.register.delay.queue”;/* *
  * DLX,死信发送到的交换
  * TODO此处的交换很重要,具体消息就是发送到该交换机的
  */公共静态最终字符串REGISTER_DELAY_EXCHANGE=癲ev.book.register.delay.exchange”;/* *
  *路由关键名称
  * TODO此处的routingKey很重要要,具体消息发送在该routingKey的
  */公共静态最终字符串DELAY_ROUTING_KEY=" ";
  
  公共静态最终字符串REGISTER_QUEUE_NAME=癲ev.book.register.queue”;
  公共静态最终字符串REGISTER_EXCHANGE_NAME=癲ev.book.register.exchange”;
  公共静态最终字符串ROUTING_KEY=八小?/* *
  *延迟队列配置
  * & lt; p>
  * 1,参数个数。把(“x-message-ttl”, 5 * 1000);
  * TODO第一种方式是直接设置队列延迟时间但如果直接给队列设置过期时间,这种做法不是很灵活,(当然二者是兼容的,默认是时间小的优先)
  * 2,rabbitTemplate。null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

SpringBoot: RabbitMQ延迟队列