[英]Spring AMQP (Rabbit) Listener goes in a loop in case of exception
[英]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.