@KafkaListener註解解密

本文會介紹一下@KafkaListener的工作流程,但是不會詳細深入。

@KafkaListener 如何使用

spring-kafka使用基於@KafkaListener註解,@KafkaListener使用方式如下

@KafkaListener(topics = "xxx")
public void testListen(List<ConsumerRecord<xxx, xxx>> records) {
    ...
}

在註解內指定topic名稱,當對應的topic內有新的消息時,testListen方法會被調用,參數就是topic內新的消息。這個過程是異步進行的。

工作流程

上面介紹了@KafkaListener的使用方式,到這裏應該是很好奇它到底是如何工作的。

@KafkaListener工作流程主要有以下幾步:

  1. 解析;解析@KafkaListener註解。
  2. 註冊;解析後的數據註冊到spring-kafka
  3. 監聽;開始監聽topic變更。
  4. 調用;調用註解標識的方法,將監聽到的數據作爲參數傳入。

下面我們一步一步分析

解析

@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工作的核心流程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章