[英]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.