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

标签 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;
}

但是,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/

相关文章:

java - 如何在PIG拉丁语的平面文件的所有列上使用子字符串操作

java - 为什么spring警告消息是“org.springframework.web.servlet.PageNotFound”?

javascript - 用于 JS 的 Eclipse 2020 语言服务器在 thymeleaf 上向 javascript 变量显示错误

rabbitmq - 如何避免使用 amqp php、持久连接和 php-fpm 的每个 tcp 连接的最大 channel 数

java - spring-amqp 请求/回复消息传递的空响应

java - 如何验证 HTML5 中约束验证 API 生成的消息中的文本?

java - 仅验证少数元素的单元测试

java - 递归打印给定数字的所有素数

java - 使用BeanUtils.copyProperties从Mybatis创建的对象到Spring Bean,Spring bean中的属性为null。为什么?

Spring RabbitListner 使用注释语法停止监听队列