Skip to content

ListenerContainerFactoryBean#createContainer NPE #1086

Closed
@Lanboo

Description

@Lanboo

ListenerContainerFactoryBean#createContainer NPE

// org.springframework.amqp.rabbit.config.ListenerContainerFactoryBean.createContainer()
private AbstractMessageListenerContainer createContainer() {
    if (this.type.equals(Type.simple)) {
        ...
    }
    else {
        ...
    }
}

在Spring中,会出现NPE问题,AbstractMessageListenerContainer#type会被set为null,从而造成NPE

Bug report

  • pom.xml
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.6.0</version>
</dependency>

<dependency>
    <groupId>org.springframework.amqp</groupId>
    <artifactId>spring-rabbit</artifactId>
    <version>2.1.10.RELEASE</version>
</dependency>
  • applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:rabbit="http://www.springframework.org/schema/rabbit" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/rabbit
     http://www.springframework.org/schema/rabbit/spring-rabbit-1.2.xsd">

    <rabbit:connection-factory id="connectionFactory" virtual-host="/" host="127.0.0.1" port="5672" username="admin" password="admin" />

    <rabbit:admin id="connectAdmin" connection-factory="connectionFactory" auto-startup="true"/>

    <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" />

    <rabbit:queue name="SPRING_QUEUE_1" durable="true" auto-delete="false" declared-by="connectAdmin" />
    <rabbit:queue name="SPRING_QUEUE_2" durable="true" auto-delete="false" declared-by="connectAdmin" />
    <rabbit:queue name="SPRING_QUEUE_3" durable="true" auto-delete="false" declared-by="connectAdmin" />

    <rabbit:direct-exchange name="SPRING_EXCHANGE_1" durable="true" auto-delete="false" declared-by="connectAdmin">
        <rabbit:bindings>
            <rabbit:binding queue="SPRING_QUEUE_1" key="spring_routing_key_1" />
            <rabbit:binding queue="SPRING_QUEUE_2" key="spring_routing_key_2" />
        </rabbit:bindings>
    </rabbit:direct-exchange>

    <rabbit:topic-exchange name="SPRING_EXCHANGE_2" durable="true" auto-declare="false" declared-by="connectAdmin">
        <rabbit:bindings>
            <rabbit:binding queue="SPRING_QUEUE_3" pattern="#.Third.#" />
        </rabbit:bindings>
    </rabbit:topic-exchange>

    <!-- 消费者 Bean -->
    <bean id="firstConsumer" class="com.xych.rabbitmq.spring.consumer.FirstConsumer" />
    <bean id="secondConsumer" class="com.xych.rabbitmq.spring.consumer.SecondConsumer" />
    <bean id="threeConsumer" class="com.xych.rabbitmq.spring.consumer.ThreeConsumer" />

    <!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
    <rabbit:listener-container connection-factory="connectionFactory">
        <rabbit:listener queues="SPRING_QUEUE_1" ref="firstConsumer" />
        <rabbit:listener queues="SPRING_QUEUE_2" ref="secondConsumer" />
        <rabbit:listener queues="SPRING_QUEUE_3" ref="threeConsumer" />
    </rabbit:listener-container>
</beans>

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions