簡體   English   中英

如何創建一個Kafka消費者庫來消費多個主題

[英]How to create a Kafka consumer library to consume multiple topics

我有“N”個 Kafka 主題,我需要根據業務邏輯來使用來自不同主題的消息。 我需要處理/過濾它們並將其發送到服務總線。我不想創建 N 個 kafka 配置來使用消息。我只想將它作為一個庫,我可以簡單地將要選擇的屬性外部化並配置消費者。這樣我就可以將業務邏輯放在我的應用程序中。 以前有沒有人做過這種實現。請讓我知道這種方法的最佳實踐。

編輯:這是我的 KafkaConsumerConfig 的樣子:

KafkaConsumerConfig.java

@Configuration
public class KafkaConsumerConfig {

    @Value("${spring.kafka.consumer.bootstrap-servers}")
    private String bootstrapServers;

    @Value("${spring.kafka.consumer.key-deserializer}")
    private String keyDeserializer;

    @Value("${spring.kafka.consumer.value-deserializer}")
    private String valueDeserializer;

    @Value("${spring.kafka.consumer.group-id}")
    private String groupIdConfig;

    @Value("${spring.kafka.consumer.auto-offset-reset}")
    private String autoOffsetResetConfig;

    @Value("${spring.kafka.consumer.client-id}")
    private String clientIdConfig;

    @Bean
    public KafkaReceiver receiver() {
        return new KafkaReceiver();
    }

    @Bean
    public ConsumerFactory<?, ?> consumerFactory() {
        return new DefaultKafkaConsumerFactory<>(consumerConfigs());
    }

    @Bean
    public Map<String, Object> consumerConfigs() {
        Map<String, Object> properties = new HashMap<>();
        properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, keyDeserializer);
        properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, valueDeserializer);
        properties.put(ConsumerConfig.GROUP_ID_CONFIG, groupIdConfig);
        properties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, autoOffsetResetConfig);
        return properties;
    }

}

您可以通過單個消費者訂閱任意數量的主題

KafkaConsumer#subscribe(Collection<String> topics)

如果您從一個主題使用不同的有效負載,那么您可以簡單地在 Class 上使用 @KafkaListener並且可以為每種類型擁有自己的路徑

例子:

@KafkaListener(id = "multi", topics = "myTopic1,mytopic2")
public class MultiListenerBean {

    @KafkaHandler
    public void listen(String foo) {

    }

    @KafkaHandler
    public void listen(Integer bar) {

    }

   @KafkaHandler(isDefault = true`)
   public void listenDefault(Object object) {

   }

 }

從版本 2.1.3 開始,您可以將 @KafkaHandler 方法指定為默認方法,如果其他方法沒有匹配,則調用該方法。 最多只能指定一種方法。 使用@KafkaHandler方法時,payload必須已經轉換為域object(這樣才能進行匹配)。 使用自定義反序列化器、JsonDeserializer 或 JsonMessageConverter,並將其 TypePrecedence 設置為 TYPE_ID。 有關詳細信息,請參閱序列化、反序列化和消息轉換。

注意:此方法不適用於批處理偵聽器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM