![](/img/trans.png)
[英]How multiple consumer can listen to multiple topic in spring boot Kafka?
[英]Listen to multiple type of objects in the same Kafka topic
我有一個用例,我將在同一主題中接收兩種 object。 我面臨的問題是所有的對象都去同一個聽眾。 未使用第二個偵聽器。
我的聽眾類似於下面
@EnableKafka
@Service
public class consumerService {
@KafkaListener(topic = "t", groupId = "g" containerFactory = "fooContainerFactory")
public void consume1(Foo foo) {
logger.info("I got : " + foo);
}
@KafkaListener(topic = "t", groupId = "g" containerFactory = "barContainerFactory")
public void consume2(Bar bar) {
logger.info("I got : " + bar);
}
}
Foo 的容器工廠在下面,我有一個類似的 Bar。
@Configuration
public class MyConsumerConfig {
@Value(value = "${kafka.bootstrapAddress}")
private String bootstrapAddress;
@Value(value = "${group.id}")
private String groupId;
public Map<String, Object> clickConsumerFactory() {
/** Set the consumer properties here */
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
props.put(JsonDeserializer.TRUSTED_PACKAGES, "*");
return props;
}
@Bean
public ConcurrentKafkaListenerContainerFactory<String, Foo> clickKafkaListenerContainerFactory() {
/** Listener factory for the class 'Foo' */
ConcurrentKafkaListenerContainerFactory<String, Foo> factory
= new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(new DefaultKafkaConsumerFactory<>(clickConsumerFactory()));
factory.setMessageConverter(new StringJsonMessageConverter());
factory.setErrorHandler(((exception, data) -> LOGGER.info("There was an error " + exception)));
return factory;
}
}
我嘗試使用 KafkaHandler,但我不知道如何指定單個容器工廠(對於 Foo:FooContainerFactory,對於 Bar:BarContainerFactory)我被困了幾個小時。 有人能告訴我我應該改變什么嗎?
我可能會離開這里。 因為我不確定@KafkaListener 是如何工作的。 但是,在我的腦海中,有可能只有一個分區並且第一個 kakfaListener 被分配給它。 因此,任何新的偵聽器(類似於 kafka 消費者)都不會被分配任何分區,因為開始時只有 1 個分區。 因此,新的偵聽器將閑置等待分配某個分區,以便他們可以開始讀取數據。
您可以通過禁用第一個 KafkaListener 然后運行您的應用程序來驗證這一點。 第二個聽眾會自動加入。
或者,如果您的主題已經有多個分區,則可能由於消息的鍵而發生這種情況,因為鍵可用於將數據發送到一個分區。 並且您的第一個偵聽器被分配給該分區。
你不能那樣做。 如果同一個主題同時包含 Foo 和 Bar 對象; 框架無法過濾掉不匹配的記錄。
而且,正如在其他評論中所說的那樣,答案,因為它們都在同一個組中,所以他們每個人都會得到一個記錄子集。
最簡單的解決方案是使用兩個不同的主題。
如果這不可能,您必須使用帶有@KafkaHandler
方法的 class 級別的偵聽器,但是您需要在反序列化器中進行轉換,而不是框架從方法參數中找出類型。
有關顯示如何執行此操作的示例的鏈接,請參閱此答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.