@RabbitListener或@RabbitHandler使用出现死循环

异常1问题:为什么会找不到消费实现?
@RabbitListener 或 @RabbitHandler 配置出错
很大原因是取决于content_type 的配置和 方法的形参。
如果通过客户端放入队列中有个content_type为空的的消息,@RabbitListener只有形参为String 的Handler,是无法对应上消费实现的。
@RabbitHandler 没有使用可选参数isDefault
消费者找不到任何一个消费实现,就回去找isDefault = true 的 handler,类似一个兜底策略。
异常1问题:处理思路
使用Message 作为方法形参
尽量将@RabbitListener 放在类上, 使用@RabbitHandler(isDefault = true) 做兜底策略
异常1分析 :死循环分析
这是一种应用级别的死循环,消息找不到消费实现,一直重试直到找到消费实现。这种死循环原因是配置失误,要在源头避免,测试阶段就要消灭。【找到消除这种死循环的方法再来填坑】。另外一种必须处理的死循环是已经找到消费实现,但是在消费的过程中造成死循环,见异常2:

【异常2】:消费过程中抛出未捕获Exception
通常是业务逻辑导致的异常如NullPointerException,无脑的做法是try-catch,处理不当依旧会造成死循环。

异常2问题:try-catch后仍然会死循环
————————————————
版权声明:本文为CSDN博主「Ch.yang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chenghan_yang/article/details/104246869

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@RabbitListener 是 Spring AMQP 框架中用于监听 RabbitMQ 队列消息的注解。下面是关于 @RabbitListener 使用的详解: 1. 引入依赖:首先,你需要在项目的 pom.xml 文件中添加 Spring AMQP 的依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 2. 创建 RabbitMQ 配置:接下来,你需要在 Spring Boot 项目中创建一个 RabbitMQ 的配置类,用于配置 RabbitMQ 连接信息和相关的队列、交换机等信息。你可以通过 @Configuration 注解来标记这个类,并使用 @Bean 注解来创建 RabbitMQ 的连接工厂和其他必要的组件。 ```java @Configuration public class RabbitMQConfig { @Value("${spring.rabbitmq.host}") private String host; @Value("${spring.rabbitmq.port}") private int port; @Value("${spring.rabbitmq.username}") private String username; @Value("${spring.rabbitmq.password}") private String password; @Bean public ConnectionFactory connectionFactory() { CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); connectionFactory.setHost(host); connectionFactory.setPort(port); connectionFactory.setUsername(username); connectionFactory.setPassword(password); return connectionFactory; } // 其他必要的组件配置... } ``` 3. 创建消息监听器:使用 @RabbitListener 注解来标记一个方法作为消息监听器。你可以在该方法上添加 @QueueBinding 注解来绑定队列和交换机,并指定相关的路由键。 ```java @Component public class MessageListener { @RabbitListener(bindings = @QueueBinding( value = @Queue(value = "myQueue", durable = "true"), exchange = @Exchange(value = "myExchange", type = ExchangeTypes.TOPIC), key = "myRoutingKey" )) public void handleMessage(String message) { // 处理接收到的消息 System.out.println("Received message: " + message); } } ``` 在上面的例子中,我们将一个名为 "myQueue" 的队列绑定到名为 "myExchange" 的交换机上,使用 "myRoutingKey" 作为路由键。当有消息到达队列时,会调用 handleMessage 方法进行处理。 4. 启用 RabbitMQ 监听:在启动类上添加 @EnableRabbit 注解,启用 RabbitMQ 的监听功能。 ```java @SpringBootApplication @EnableRabbit public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 现在,当有消息发送到名为 "myQueue" 的队列时,@RabbitListener 注解所标记的方法将会被触发,并处理接收到的消息。 这就是 @RabbitListener使用详解。希望对你有所帮助!如果你还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值