Search code examples
rabbitmqspring-amqpspring-rabbit

Double connections for one consumer


I am a new user of RabbitMQ and I really enjoy it but I have an issue (well it doesn't throw any error and it doesn't affect anything except my mind ...).

Each time I run a consumer, it creates 2 connections. I can't find why so I am asking for your help.

I am using Spring-Boot and Spring AMQP (maybe it because of Spring ...)

Here is the code :

receiver-context.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.1.xsd
http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd">

  <rabbit:connection-factory id="connectionFactory" host="localhost" username="admin" password="admin" />

  <bean id="receiver" class="com.test.Receiver" />

  <bean id="messageListener" class="org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter" >
      <constructor-arg name="delegate" ref="receiver"/>
      <constructor-arg name="defaultListenerMethod" value="receiveMessage" />
  </bean>

  <bean id="container" class="org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer" > 
    <property name="connectionFactory" ref="connectionFactory" />
    <property name="queueNames" value="AMQP-PoC" />
    <property name="messageListener" ref="messageListener" />
    <property name="defaultRequeueRejected" value="false" />
  </bean>

AMQPPoCReceiverApplication.java

@SpringBootApplication
@ImportResource("classpath:com.test/rabbit-receiver-context.xml")
public class AMQPPoCReceiverApplication implements CommandLineRunner {

  private AnnotationConfigApplicationContext context;

  @Override
  public void run(String... strings) throws Exception {
      context = new   AnnotationConfigApplicationContext(AMQPPoCReceiverApplication.class);
      System.out.println("Waiting for message");
  }

  @Override
  protected void finalize() throws Throwable {
      super.finalize();
      this.context.close();
  }

  public static void main(String[] args) {
      SpringApplication.run(AMQPPoCReceiverApplication.class, args);
  }
}

Receiver.java

public class Receiver {

  public void receiveMessage(String message) {
      System.out.println("Message received : " + message);
  }
}

Here the logs at the start (notice the lines with the double '*'):

2016-02-18 11:32:51.956  INFO 10196 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2016-02-18 11:32:51.966  INFO 10196 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase -2147482648
2016-02-18 11:32:51.967  INFO 10196 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase 2147483647
**2016-02-18 11:32:52.062  INFO 10196 --- [cTaskExecutor-1] o.s.a.r.c.CachingConnectionFactory       : Created new connection: SimpleConnection@2069bb0a [delegate=amqp://admin@127.0.0.1:5672/]**
2016-02-18 11:32:52.148  INFO 10196 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 52752 (http)
2016-02-18 11:32:52.153  INFO 10196 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@57bf85b2: startup date [Thu Feb 18 11:32:52 GMT+01:00 2016]; root of contex
t hierarchy
**2016-02-18 11:32:52.320  INFO 10196 --- [           main] o.s.b.f.xml.XmlBeanDefinitionReader      : Loading XML bean definitions from class path resource [com.test/receiver-context.xml]**
2016-02-18 11:32:52.357  INFO 10196 --- [           main] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2016-02-18 11:32:52.362  INFO 10196 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.amqp.rabbit.annotation.RabbitBootstrapConfiguration' of type [class org.springframework.amqp.rabbit.annotation.RabbitBootstrapConfigur
ation$$EnhancerBySpringCGLIB$$eccd4a65] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2016-02-18 11:32:52.487  INFO 10196 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2016-02-18 11:32:52.489  INFO 10196 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase -2147482648
2016-02-18 11:32:52.489  INFO 10196 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase 2147483647
**2016-02-18 11:32:52.498  INFO 10196 --- [cTaskExecutor-1] o.s.a.r.c.CachingConnectionFactory       : Created new connection: SimpleConnection@768748cf [delegate=amqp://admin@127.0.0.1:5672/]**
Waiting for message
2016-02-18 11:32:52.505  INFO 10196 --- [           main] com.test.AMQPPoCReceiverApplication   : Started AMQPPoCReceiverApplication in 3.509 seconds (JVM running for 6.961)

And here the double connections: enter image description here

If I stop the client, it closes both (that is why I am sure it's a double connections for the same consumer).

If you need more information, ask here and I will reply as soon as possible.

Thank you all for any kind of help.


Solution

  • The answer is simple : I created 2 contexts in the same application.

    new AnnotationConfigApplicationContext(AMQPPoCReceiverApplication.class);
    

    and

    SpringApplication.run(AMQPPoCReceiverApplication.class, args);
    

    Only create one and it's done !