RocketMQListener监听器的使用思考

本文深入解析了Spring RocketMQ如何通过实现RocketMQListener接口消费消息的内部机制。通过分析源码,发现Spring RocketMQ底层使用DefaultRocketMQListenerContainer封装原生Consumer,该容器在bean初始化后调用initRocketMQPushConsumer方法设置消息监听器。监听器根据业务逻辑决定是否ack消息。此外,文章还提供了官方源码链接及一系列消息中间件的演示demo供学习参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

刚开始用Spring-rocketmq时,好奇怎么只需要一个实现了RocketMQListener接口的自定义监听器就可以消费消息了:

这个自定义的消息监听器里,并没有如rocketmq原生Consumer那样对消息进行ack或者nack,那他到底是怎么控制的?为此专门看了下源码,全局搜了@RocketMQMessageListener注解,搜到一些东西,分享下:

源码

核心类:ListenerContainerConfiguration/DefaultRocketMQListenerContainer

首先ListenerContainerConfiguration实现了SmartInitializingSingleton接口,会在bean都实例化完之后,触发afterSingletonsInstantiated方法:

上面从Spring上下文中拿到了所有加了@RocketMQMessageListener的bean,咱们自定义的这个CommonMessageListener也就拿到了,接着执行registerContainer方法,其中的关键代码:

上面通过createRocketMQListenerContainer方法创建了一个DefaultRocketMQListenerContainer的BeanDefinition,交给Spring容器管理,annotation即是@RocketMQMessageListener注解参数的实例,

内部两个关键的地方:

1.DefaultRocketMQListenerContainer#setRocketMQMessageListener方法将注解中的参数值进行赋值:

2.DefaultRocketMQListenerContainer#setRocketMQListener或者DefaultRocketMQListenerContainer#setRocketMQReplyListener方法设置当前的这个CommonMessageListener设置进去:

DefaultRocketMQListenerContainer实现了InitializingBean接口,所以,最终当其作为一个bean实例化出来之后,就会调用初始化方法:

initRocketMQPushConsumer方法是关键,看名字就知道初始化了rocketmq原生的Consumer并进行队列监听,监听之前先设置MessageListener对象:

这里已经是原生的rocketmq的Consumer对象了,所以消息会到这个MessageListener中,以DefaultMessageListenerOrderly源码为例:

handleMessage方法里就会调用我们自定义的CommonMessageListener#onMessage方法:

 

结论

spring rocketmq底层通过DefaultRocketMQListenerContainer这个类封装原生的Consumer对象来消费消息,其内部的DefaultMessageListenerConcurrently和DefaultMessageListenerOrderly两个消息监听器会根据我们的业务是否抛出异常来决定消息是否ack!

 

资源分享

官方源码地址:

 https://github.com/apache/rocketmq-spring.git

另外关于消息中间件,分享本人写的几个演示demo,包括了各种官方接口的使用姿势,共同学习!

Rocket Mq演示demo

Rabbit Mq演示demo

很抱歉,刚才回答的应该是 @RocketMQMessageListener 注解,而不是 @RocketMQListener 注解,感谢你的指正。下面我将正确回答 @RocketMQListener 注解的使用: @RocketMQListener 注解用于简化 RocketMQ 消息监听器的编写。使用该注解,你只需要编写一个普通的方法,并在该方法上添加 @RocketMQMessageListener 注解,就可以将这个方法作为 RocketMQ 消息监听器使用。例如: ```java @Component public class TestListener { @RocketMQListener(topic = "test-topic", consumerGroup = "test-group") public void onMessage(String message) { System.out.println("Received message: " + message); } } ``` 在该示例中,我们定义了一个名为 TestListener 的类,其中有一个名为 onMessage 的方法,用于处理接收到的消息。该方法使用了 @RocketMQListener 注解,指定了监听的主题为 test-topic,消费者组名为 test-group。在 onMessage 方法中,我们只是简单地打印了接收到的消息。 最后,你可以在其他地方发送消息到 test-topic 主题,TestListener 的 onMessage 方法就会自动接收并处理消息。 需要注意的是,@RocketMQListener 注解只能用于方法上,并且该方法的参数类型需要与发送消息时的类型参数一致,如果你发送的是 JSON 字符串,则可以使用 RocketMQ 的 JSON 序列化器,将方法的参数类型设置为 com.alibaba.fastjson.JSONObject。如果你需要处理其他类型的消息,可以自定义序列化器。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值