apache / rocketmq-spring

Apache RocketMQ Spring Integration
https://rocketmq.apache.org/
Apache License 2.0
2.09k stars 894 forks source link

RocketMQ监听者收到消息后发送到其他Topic时报空指针异常 #632

Closed lilinjiang closed 6 months ago

lilinjiang commented 6 months ago

报错日志: java.lang.NullPointerException: null at org.apache.rocketmq.spring.core.RocketMQTemplate.syncSend(RocketMQTemplate.java:708)

问题原因: 经过排查源码发现 监听者准备完成的时机早于生产者准备完成。导致项目启动时监听者监听到消息后立即通过@ExtRocketMQTemplateConfiguration注解扩展的RocketMQTemplate发送消息产生空指针,因为此时RocketMQTemplate的producer(实际的生产者)属性等于null

监听者是基于BeanPostProcessor 的 postProcessAfterInitialization 方法实现启动监听

生产者是基于SmartInitializingSingleton的afterSingletonsInstantiated 方法实现设置真正的生产者(晚于监听者准备好)

监听者图片 生产者图片

解决办法:

ListenerContainerConfiguration 新增 private final List containers = new ArrayList<>(); 并修改以下代码

Snipaste_2024-02-22_22-05-43

RocketMQMessageListenerBeanPostProcessor 增加实现 SmartLifecycle 并修改以下代码 1708610869203