在Spring AMQP中关闭与SimpleMessageListenerContainer相关的连接

时间:2017-08-29 14:24:50

标签: java spring amqp spring-amqp spring-rabbitmq

我目前正在研究基于事件的异步AMQP消息监听器,如下所示:

@Configuration
public class ExampleAmqpConfiguration {

    @Bean(name = "container")
    public SimpleMessageListenerContainer messageListenerContainer() {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(rabbitConnectionFactory());
        container.setQueueName("some.queue");
        container.setMessageListener(exampleListener());
        return container;
    }

    @Bean
    public ConnectionFactory rabbitConnectionFactory() {
        CachingConnectionFactory connectionFactory =
            new CachingConnectionFactory("localhost");
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        return connectionFactory;
    }

    @Bean
    public MessageListener exampleListener() {
        return new MessageListener() {
            public void onMessage(Message message) {
                System.out.println("received: " + message);
            }
        };
    }
}

我已将容器bean的autostart属性更改为false。我已经将这个bean自动装配到一个事件lister,它在StartEvent发生时启动容器:

@EventListener
public void startContainer(StartEvent startEvent) {
     this.container.start();
}

同时,我还将bean自动装配到另一个事件,该事件停止容器并关闭容器,希望容器将被停止并且不会有连续的延迟:

@EventListener
public void endContainer(EndEvent endEvent) {
     this.container.stop();
     this.container.shutdown();
}

但是,在EndEvent之后,我在RabbitMQ管理控制台中发现所有通道都已关闭,但仍然存在延迟连接。

这是否意味着shutdown()不是用于删除延迟连接的正确方法?如果是这种情况,使用什么方法是正确的?

感谢。

1 个答案:

答案 0 :(得分:2)

您需要致电resetConnection()上的CachingConnectionFactory来关闭连接;正如班级名称所暗示;连接已缓存。