我目前正在研究基于事件的异步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()不是用于删除延迟连接的正确方法?如果是这种情况,使用什么方法是正确的?
感谢。
答案 0 :(得分:2)
您需要致电resetConnection()
上的CachingConnectionFactory
来关闭连接;正如班级名称所暗示;连接已缓存。