我目前有一个AMQP异步侦听器,它会自动侦听队列中的消息。
但是,我的要求是,在某个事件发生之前,我不应该让这个监听器听取消息。对于事件,我正在考虑使用@EventListener注释。
异步侦听器如下所示:
@Configuration
public class ExampleAmqpConfiguration {
@Bean
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);
}
};
}
}
我正在考虑将@EventListener添加到方法messageListenerContainer()中,所以它看起来像这样:
@Bean
@EventListener
public SimpleMessageListenerContainer messageListenerContainer(CustomeEvent customEvent) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(rabbitConnectionFactory());
container.setQueueName("some.queue");
container.setMessageListener(exampleListener());
return container;
}
但是,无论EventListener如何,messageListenerContainer()bean似乎都在启动时运行。
只有在CustomEvent发生后,这个异步列表器才能听取消息的正确方法是什么?
感谢。
答案 0 :(得分:2)
将容器autoStartup
属性设置为false
。
在@EventListener
中,自动连接容器并start()
。
修改强>
public class MyEventListener {
@Autowired
private SimpleMessageListenerContainer container;
@EventListener
public void someEvent(MyEvent event) {
this.container.start();
}
}
和
@Bean
public MyEventListener listener() {
return new EventListener();
}