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

时间:2017-08-28 14:53:58

标签: java spring amqp event-listener spring-amqp

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

感谢。

1 个答案:

答案 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();
}