簡體   English   中英

Spring kafka在一個使用者中使用多個Message類型

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

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