一个消费者

时间:2016-02-18 11:34:00

标签: rabbitmq spring-amqp spring-rabbitmq

我是RabbitMQ的新用户,我真的很喜欢它,但我有一个问题(好吧它没有抛出任何错误,除了我的想法,它不会影响任何事情......)。

每次运营消费者时,都会创建2个连接。我无法找到原因,所以我在寻求你的帮助。

我正在使用Spring-Boot和Spring AMQP(也许是因为Spring ...)

以下是代码:

接收机-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);
  }
}

这里是开始时的日志(注意带有'*'的行):

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)

这里有双重连接: enter image description here

如果我停止客户端,它会关闭两者(这就是为什么我确定它是同一个消费者的双重连接)。

如果您需要更多信息,请在此处询问,我会尽快回复。

感谢所有人的帮助。

1 个答案:

答案 0 :(得分:0)

答案很简单:我在同一个应用程序中创建了2个上下文。

new AnnotationConfigApplicationContext(AMQPPoCReceiverApplication.class);

SpringApplication.run(AMQPPoCReceiverApplication.class, args);

只创建一个就完成了!