我目前有一个 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;
}
但是,messageListenerContainer() bean 似乎只是在启动时运行,而与 EventListener 无关。
仅在 CustomEvent 发生后,该异步监听器监听消息的正确方法是什么?
谢谢。
最佳答案
将容器 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();
}
关于java - AMQP 异步监听器仅在事件发生后才开始监听消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45921860/