Closed lilinjiang closed 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<>(); 并修改以下代码
RocketMQMessageListenerBeanPostProcessor 增加实现 SmartLifecycle 并修改以下代码
报错日志: 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<>();
并修改以下代码
RocketMQMessageListenerBeanPostProcessor 增加实现 SmartLifecycle 并修改以下代码