AMQP 异步侦听器仅在事件发生后才开始侦听消息

AMQP async listener starts listening to message only after an event happens

我目前有一个 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 发生后,此异步侦听器侦听消息的正确方法是什么?

谢谢。

将容器 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();
}