簡體   English   中英

Spring AMQP Rabbit 偵聽器在“ApplicationReadyEvent”之前觸發

[英]Spring AMQP Rabbit listener firing before "ApplicationReadyEvent"

在 Spring 應用程序啟動時,我想在Redis查找一個值,並根據該值我想關閉或保留我擁有的消息偵聽器。

也可以根本不初始化這些 bean,但我也找不到方法。

目前,我正在嘗試使用 Spring 的ApplicationReadyEvent關閉容器:

@Component
public class ApplicationStartup implements ApplicationListener<ApplicationReadyEvent> {

    private @Autowired @Qualifier("completedOrderContainer") SimpleMessageListenerContainer container;
    private @Autowired RedisManagerImpl redis;

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        if (!Boolean.valueOf(redis.isRabbitListenerActive())) container.shutdown();
    }

}

Container & AMQP beans 初始化如下:

    @Bean
    @Conditional(RabbitCondition.class)
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setAddresses(rabbitHost + ":" + rabbitPort);
        connectionFactory.setUsername(rabbitUsername);
        connectionFactory.setPassword(rabbitPassword);
        return connectionFactory;
    }

    @Bean
    @Conditional(RabbitCondition.class)
    Queue completedOrderQueue() {
        return new Queue(completedOrderQueueName, true);
    }

    @Bean
    @Conditional(RabbitCondition.class)
    TopicExchange completedOrderExchange() {
        return new TopicExchange(completedOrderExchangeName);
    }

    @Bean
    @Conditional(RabbitCondition.class)
    Binding binding(Queue completedOrderQueue, TopicExchange completedOrderExchange) {
        return BindingBuilder.bind(completedOrderQueue).to(completedOrderExchange).with(completedOrderQueueName);
    }

    @Bean
    @Conditional(RabbitCondition.class)
    SimpleMessageListenerContainer completedOrderContainer(ConnectionFactory connectionFactory, MessageListenerAdapter completedOrderListenerAdapter) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames(completedOrderQueueName);
        container.setMessageListener(completedOrderListenerAdapter);
        return container;
    }

    @Bean
    @Conditional(RabbitCondition.class)
    MessageListenerAdapter completedOrderListenerAdapter(CompletedOrderMessageReceiver receiver) {
        return new MessageListenerAdapter(receiver, "completedOrder");
    }

消息監聽器:

@Component
public class CompletedOrderMessageReceiver {
    public void completedOrder(Object asyncTask) throws Exception {
        //impl
    }
}

問題是,如果我使用隊列中已有的消息啟動應用程序,則消息偵聽器將在執行container.shutdown()之前獲取該消息。

有沒有辦法實現我的目標? 即使采用不同的方法

在偵聽器容器上將autoStartup設置為false 然后根據需要start()stop()它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM