一、背景
和其他业务方对接mq消息, 使用的是rabbitmq的topic exchange模式。后面由于业务的变更,不需要与之对接,我就将和mq订阅消息的相关代码删除了。
没过几天,运维发现一个队列的消息积压严重。经过排查程序是最新的,已删除了消费侧的代码,程序也不会去订阅新的消息。但是,rabbitmq后台的交换机和队列依旧存在,也需要删除,并且只能手动删除。
二、代码示例
1、MqConfig.java
private String exchangeAppChangesExchange = "exchange-app-changes";
private String exchangeAppChangesKey = "apd-app-changes";
private String exchangeAppChangesQueue = "apd-app-changes-trade";
@Bean
public TopicExchange exchangeAppChangesExchange() {
return new TopicExchange(getExchangeAppChangesExchange());
}
@Bean
public Binding bindExchangeAppChangesQueue(Queue exchangeAppChangesQueue, TopicExchange exchangeAppChangesExchange) {
return BindingBuilder.bind(exchangeAppChangesQueue).to(exchangeAppChangesExchange).with(getExchangeAppChangesKey());
}
@Bean
public Queue exchangeAppChangesQueue() {
return new Queue(getExchangeAppChangesQueue());
}
2、MqMessageListener.java
@RabbitListener(queues = "#{mqConfig.exchangeAppChangesQueue}", concurrency = "4")
public void exchangeAppChanges(@Payload List<UserAppChangesLog> userAppChangesLogList) {
}
三、解决办法
exchanges.png手动解绑交换机到队列的绑定关系;并且删除队列。因为程序是会自动注册到rabbitmq,但是当程序删掉或不订阅mq消息时,无法做到自动剔除。如果不手动删除,会导致mq消息队列的积压越来越严重,因为此时没有了消费者,而生产的消息是越来越多。
交换机解绑队列.png
删除队列.png
网友评论