<代码> 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)> 代码,那么这些<代码>死信> 代码就会被重新发送到<代码>死信交换代码>中,然后通过<代码> 代码>路死信交换由到其他队列,即可实现延迟队列的功能。
导入依赖
在<代码>砰的一声。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> 代码>属性配置
在<代码>应用程序。属性> 代码文件中配置rabbitmq <代码> 代码>相关内容,值得注意的是这里配置了手动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 nullSpringBoot: RabbitMQ延迟队列