热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RabbitMQ进阶使用延时队列的配置(SpringBoot)

rabbitmq,进阶,使用,延时,队列,的,配置,s

依赖

  • MAVEN配置pom.xml
 org.springframework.boot spring-boot-starter-amqp  
  • Gradle配置build.gradle
compile('org.springframework.boot:spring-boot-starter-amqp') 

连接配置

得益于spring boot的约定大于配置,只需要在application.yml加入下面配置即可。

spring: rabbitmq: host: host port: port username: admin password: passwd 

简单自定义RabbitTemplate和Queue配置

默认的配置还是略显不足,增加序列化配置如下:

@Configuration public class QueueConfig { /** * 自动注入为SimpleRabbitListenerContainerFactory的消息序列化转换器 */ @Bean public MessageConverter messageConverter() { return new Jackson2JsonMessageConverter(); } /** * 持久化交换机 */ @Bean(name = "exchange") public FanoutExchange exchange() { return new FanoutExchange("exchange1", true, false); } /** * 持久化队列 */ @Bean public Queue queue() { return new Queue("queue", true); } /** * 将队列和exchange绑定 * * @return binding */ @Bean Binding bindingSmsExchangeSmsQueue() { return BindingBuilder.bind(queue()).to(exchange()); } } 

特殊延时队列的配置

延时队列的用法这里就不详细说了,参考Spring Boot与RabbitMQ结合实现延迟队列的示例,有些场景如未支付订单30分钟过期等,可通过延时队列实现

 @Bean public Queue delayQueue(){ return QueueBuilder.durable("delayQueue") //队列名称 .withArgument("x-message-ttl",10000) //死信时间 .withArgument("x-dead-letter-exchange", "") //死信重新投递的交换机 .withArgument("x-dead-letter-routing-key", "queue")//路由到队列的routingKey .build(); } 

启动应用测试一下

启动应用,在rabbit管理web查看所有队列

  • 所有队列
  • 查看delayQueue详情,框框中为延时配置 将"x-message-ttl"参数改成20000重启发现问题,控制队列里面的参数也没有修改成功

修改带参数队列失败的问题

问题分析

根据日志提示,队列已经存在而且参数不一致导致,然后查看源码在RabbitAdmin发现下面代码,在创建队列失败的时候会调用logOrRethrowDeclarationException方法,logOrRethrowDeclarationException方法中发布了一个DeclarationExceptionEvent事件,到这里解决思路有,监听这个事件,然后删除相应的队列

 private DeclareOk[] declareQueues(final Channel channel, final Queue... queues) throws IOException { List declareOks = new ArrayList(queues.length); for (int i = 0; i  void logOrRethrowDeclarationException(Declarable element, String elementType, T t) throws T { DeclarationExceptionEvent event = new DeclarationExceptionEvent(this, element, t); this.lastDeclaratiOnExceptionEvent= event; if (this.applicationEventPublisher != null) { this.applicationEventPublisher.publishEvent(event); } if (this.ignoreDeclarationExceptions || (element != null && element.isIgnoreDeclarationExceptions())) { if (this.logger.isDebugEnabled()) { this.logger.debug("Failed to declare " + elementType + ": " + (element == null ? "broker-generated" : element) + ", continuing...", t); } else if (this.logger.isWarnEnabled()) { Throwable cause = t; if (t instanceof IOException && t.getCause() != null) { cause = t.getCause(); } this.logger.warn("Failed to declare " + elementType + ": " + (element == null ? "broker-generated" : element) + ", continuing... " + cause); } } else { throw t; } } 

解决方法

写一个DeclarationExceptionEvent事件监听,处理创建失败的队列,既删除掉

@Component public class DeclarationExceptionEventListener { @Autowired private AmqpAdmin rabbitAdmin; @EventListener(classes = DeclarationExceptionEvent.class) public void listen(DeclarationExceptionEvent event) { final Declarable declarable = event.getDeclarable(); if (declarable instanceof Queue) { final Queue queue = (Queue) declarable; rabbitAdmin.deleteQueue(queue.getName()); } } } 

改完重启应用,只有一条异常日志(原来4条),还有一条的原因是第一次创建失败发布事件,我们监听了事件进行处理。查看rabbit控制台,参数修改成功。


推荐阅读
  • 利用RabbitMQ实现高效延迟任务处理
    本文详细探讨了如何利用RabbitMQ实现延迟任务,包括其应用场景、实现原理、系统设计以及具体的Spring Boot实现方式。 ... [详细]
  • 我有一个SpringRestController,它处理API调用的版本1。继承在SpringRestControllerpackagerest.v1;RestCon ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • ssm框架整合及工程分层1.先创建一个新的project1.1配置pom.xml ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • springMVC JRS303验证 ... [详细]
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
  • Servlet过滤器入门:实现与配置
    本文介绍如何在Java Web应用中实现和配置Servlet过滤器,通过实现`javax.servlet.Filter`接口来创建过滤器,并详细说明其在web.xml文件中的配置方法。 ... [详细]
  • 本文详细介绍了Linux内核中misc设备驱动框架的实现原理及应用方法,包括misc设备的基本概念、驱动框架的初始化过程、数据结构分析以及设备的注册与注销流程。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • Docker 自定义网络配置详解
    本文详细介绍如何在 Docker 中自定义网络设置,包括网关和子网地址的配置。通过具体示例展示如何创建和管理自定义网络,以及容器间的通信方式。 ... [详细]
  • 本文介绍了如何通过扩展 Panel 控件来实现滚动条位置的自动保存和恢复。类似于 Page 的 MaintainScrollPositionOnPostBack 属性,我们将在自定义的 TBPanel 控件中添加相同的功能。 ... [详细]
  • 本文探讨了随着并发需求的增长,MySQL数据库架构如何从简单的单一实例发展到复杂的分布式系统,以及每一步演进背后的原理和技术解决方案。 ... [详细]
author-avatar
无孔的鸟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有