Skip to content

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

@lilinjiang

Description

@lilinjiang

报错日志:
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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions