本文會介紹一下@KafkaListener
的工作流程,但是不會詳細深入。
@KafkaListener 如何使用
spring-kafka
使用基於@KafkaListener
註解,@KafkaListener
使用方式如下
@KafkaListener(topics = "xxx")
public void testListen(List<ConsumerRecord<xxx, xxx>> records) {
...
}
在註解內指定topic
名稱,當對應的topic
內有新的消息時,testListen
方法會被調用,參數就是topic
內新的消息。這個過程是異步進行的。
工作流程
上面介紹了@KafkaListener
的使用方式,到這裏應該是很好奇它到底是如何工作的。
@KafkaListener
工作流程主要有以下幾步:
- 解析;解析
@KafkaListener
註解。 - 註冊;解析後的數據註冊到
spring-kafka
。 - 監聽;開始監聽
topic
變更。 - 調用;調用註解標識的方法,將監聽到的數據作爲參數傳入。
下面我們一步一步分析
解析
@KafkaListener
註解由KafkaListenerAnnotationBeanPostProcessor
類解析,後者實現了BeanPostProcessor
接口,這個接口如下
public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
接口內部有2
個方法,分別在bean
初始化前後被調用。
KafkaListenerAnnotationBeanPostProcessor
內會在postProcessAfterInitialization
方法內解析@KafkaListener
註解。
註冊
解析步驟裏,我們可以獲取到所有含有@KafkaListener
註解的類,之後這些類的相關信息會被註冊到 KafkaListenerEndpointRegistry
內,包括註解所在的方法,當前的bean
等。KafkaListenerEndpointRegistry
這個類內部會維護多個Listener Container
,每一個@KafkaListener
都會對應一個Listener Container
。並且每個Container
對應一個線程。
監聽
註冊完成之後,每個Listener Container
會開始工作,會新啓一個新的線程,初始化KafkaConsumer
,監聽topic
變更等。
調用
監聽到數據之後,container
會組織消息的格式,隨後調用解析得到的@KafkaListener
註解標識的方法,將組織後的消息作爲參數傳入方法,執行用戶邏輯。
總結
上面4個步驟就是@KafkaListener
工作的核心流程。