Spring AMQP Rabbit监听器在“ ApplicationReadyEvent”之前触发

时间:2019-12-24 13:05:31

标签: spring spring-boot rabbitmq spring-amqp spring-rabbit

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

}

容器和AMQP Bean的初始化如下:

    @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()之前接收消息。

有没有办法实现我的目标?即使采用不同的方法

1 个答案:

答案 0 :(得分:1)

在侦听器容器上将autoStartup设置为false。然后根据需要start()stop()