@Component
public class MultiQueueListener {
@RabbitListener(queues = "textQueue")
public void processTextMessage(String text) {
// 处理来自textQueue的文本消息
@RabbitListener(queues = "ordersQueue")
public void processOrder(Order order) {
// 处理来自ordersQueue的订单消息
这个例子展示了在同一个类中,不同的方法可以监听不同的队列。processTextMessage
监听 textQueue
队列,而 processOrder
监听 ordersQueue
队列。
这些例子展示了 @RabbitListener
和 @RabbitHandler
在不同场景下的应用方式,包括单独使用 @RabbitListener
、将 @RabbitListener
与 @RabbitHandler
结合使用以及在同一个类中使用多个 @RabbitListener
注解来监听不同的队列。
附:@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后仍然会死循环
到此这篇关于Spring中@RabbitHandler和@RabbitListener区别的文章就介绍到这了,更多相关@RabbitHandler和@RabbitListener区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
2006-2024 脚本之家 JB51.Net , All Rights Reserved.
苏ICP备14036222号