[英]Spring kafka Consume multiple Message types in one consumer
我有多個生產者可以將多種類型的事件發送到一個kafka主題。
我有一個消費者必須消費所有類型的消息。 對每種類型的消息都有不同的邏輯。
@KafkaListener(topics = "test", containerFactory = "kafkaListenerContainerFactory")
public void handleEvent(Message<EventOne> event) {
logger.info("event={}", event);
}
但在這種情況下,所有消息都不僅僅是EventOne
如果我實現兩個方法(對於每種類型的消息),那么所有消息只有一個方法。
如果我實現這樣的監聽器:
@KafkaListener(topics = "test", containerFactory = "kafkaListenerContainerFactory")
public void handleEvent(Message<?> event) {
logger.info("event={}", event);
}
然后我得到異常:org.springframework.kafka.KafkaListenerEndpointContainer#0-0-kafka-listener-1] ERROR org.springframework.kafka.listener.LoggingErrorHandler - 處理時出錯:ConsumerRecord java.lang.IllegalArgumentException:Unrecognized Type:[null ]
請告訴我如何實現多種類型的消費者?
我找到了靈魂,這很簡單。 所以,從問題中不清楚,但我使用jsonMessageConverter是這樣的:
@Bean
ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
factory.setMessageConverter(new StringJsonMessageConverter());
return factory;
}
默認情況下,Jackson庫不會為JSON添加類信息,因此無法猜測我想要反序列化的類型。 解決方案是注釋
@JsonTypeInfo(use= JsonTypeInfo.Id.CLASS, include= JsonTypeInfo.As.PROPERTY, property="class")
將類信息添加到json字符串。 在消費者方面,我只寫了我的活動的基類
@KafkaListener(topics = "test", containerFactory = "kafkaListenerContainerFactory")
public void handleEvent(BasicEvent event) {
if (event instanceof EventOne) {
logger.info("type={EventOne}, event={}", event);
} else {
logger.info("type={EventTwo}, event={}", event);
}
}
希望這些信息有助於某人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.