清除不再使用的topic AdminBrokerProcessor#cleanUnusedTopic
AdminBrokerProcessor#processRequest#this.cleanUnusedTopic(ctx, request)
public RemotingCommand cleanUnusedTopic() {
log.warn("invoke cleanUnusedTopic start.");
final RemotingCommand response = RemotingCommand.createResponseCommand(null);
brokerController.getMessageStore().cleanUnusedTopic(brokerController.getTopicConfigManager().getTopicConfigTable().keySet());
log.warn("invoke cleanUnusedTopic end.");
response.setCode(ResponseCode.SUCCESS);
response.setRemark(null);
return response;
}
看到brokerController.getMessageStore().cleanUnusedTopic这个方法就发现很眼熟,之前的 删除topic也用了这个方法。删除topic是先把topic配置从topicConfigTable里面删除了,导致topic失效,然后调用cleanUnusedTopic清除掉这个topic信息。
DefaultMessageStore#cleanUnusedTopic
/**
* 有效的topics列表
* @param topics all valid topics.
* @return
*/
@Override
public int cleanUnusedTopic(Set<String> topics) {
// 遍历缓存的消息队列
Iterator<Entry<String, ConcurrentMap<Integer, ConsumeQueue>>> it = this.consumeQueueTable.entrySet().iterator();
while (it.hasNext()) {
Entry<String, ConcurrentMap<Integer, ConsumeQueue>> next = it.next();
String topic = next.getKey();
if (!topics.contains(topic) && !topic.equals(ScheduleMessageService.SCHEDULE_TOPIC)) {
ConcurrentMap<Integer, ConsumeQueue> queueTable = next.getValue();
for (ConsumeQueue cq : queueTable.values()) {
// 消费队列销毁
cq.destroy();
log.info("cleanUnusedTopic: {} {} ConsumeQueue cleaned",
cq.getTopic(),
cq.getQueueId()
);
// 删除消息队列
this.commitLog.removeQueueFromTopicQueueTable(cq.getTopic(), cq.getQueueId());
}
// topic所在的消息队列删除完毕后消费队列所在的集合元素删除
it.remove();
log.info("cleanUnusedTopic: {},topic destroyed", topic);
}
}
return 0;
}