简体   繁体   English

NestJs 卡夫卡到 Spring 卡夫卡

[英]NestJs Kafka to Spring Kafka

I Have Simple NestJs Kafka producer and Springboot Kafka Consumer.我有简单的 NestJs Kafka 生产者和 Springboot Kafka 消费者。 when i send messge in kafka producer the kafka consumer give the following error.当我在 kafka 生产者中发送消息时,kafka 消费者会给出以下错误。

// //

java.lang.IllegalStateException: This error handler cannot process 'SerializationException's directly; please consider configuring an 'ErrorHandlingDeserializer' in the value and/or key deserializer
    at org.springframework.kafka.listener.DefaultErrorHandler.handleOtherException(DefaultErrorHandler.java:151) ~[spring-kafka-2.8.8.jar:2.8.8]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.handleConsumerException(KafkaMessageListenerContainer.java:1809) ~[spring-kafka-2.8.8.jar:2.8.8]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:1301) ~[spring-kafka-2.8.8.jar:2.8.8]
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[na:na]
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
    at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
Caused by: org.apache.kafka.common.errors.RecordDeserializationException: Error deserializing key/value for partition schdule-topics-0 at offset 1. If needed, please seek past the record to continue consumption.
    at org.apache.kafka.clients.consumer.internals.Fetcher.parseRecord(Fetcher.java:1448) ~[kafka-clients-3.1.1.jar:na]
    at org.apache.kafka.clients.consumer.internals.Fetcher.access$3400(Fetcher.java:135) ~[kafka-clients-3.1.1.jar:na]
    at org.apache.kafka.clients.consumer.internals.Fetcher$CompletedFetch.fetchRecords(Fetcher.java:1671) ~[kafka-clients-3.1.1.jar:na]
    at org.apache.kafka.clients.consumer.internals.Fetcher$CompletedFetch.access$1900(Fetcher.java:1507) ~[kafka-clients-3.1.1.jar:na]
    at org.apache.kafka.clients.consumer.internals.Fetcher.fetchRecords(Fetcher.java:733) ~[kafka-clients-3.1.1.jar:na]
    at org.apache.kafka.clients.consumer.internals.Fetcher.fetchedRecords(Fetcher.java:684) ~[kafka-clients-3.1.1.jar:na]
    at org.apache.kafka.clients.consumer.KafkaConsumer.pollForFetches(KafkaConsumer.java:1277) ~[kafka-clients-3.1.1.jar:na]
    at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1238) ~[kafka-clients-3.1.1.jar:na]
    at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1211) ~[kafka-clients-3.1.1.jar:na]
    at jdk.internal.reflect.GeneratedMethodAccessor50.invoke(Unknown Source) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.3.22.jar:5.3.22]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) ~[spring-aop-5.3.22.jar:5.3.22]
    at jdk.proxy2/jdk.proxy2.$Proxy112.poll(Unknown Source) ~[na:na]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.pollConsumer(KafkaMessageListenerContainer.java:1529) ~[spring-kafka-2.8.8.jar:2.8.8]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doPoll(KafkaMessageListenerContainer.java:1519) ~[spring-kafka-2.8.8.jar:2.8.8]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.pollAndInvoke(KafkaMessageListenerContainer.java:1343) ~[spring-kafka-2.8.8.jar:2.8.8]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:1255) ~[spring-kafka-2.8.8.jar:2.8.8]
    ... 3 common frames omitted
Caused by: java.lang.IllegalStateException: No type information in headers and no default type provided
    at org.springframework.util.Assert.state(Assert.java:76) ~[spring-core-5.3.22.jar:5.3.22]
    at org.springframework.kafka.support.serializer.JsonDeserializer.deserialize(JsonDeserializer.java:583) ~[spring-kafka-2.8.8.jar:2.8.8]
    at org.apache.kafka.clients.consumer.internals.Fetcher.parseRecord(Fetcher.java:1439) ~[kafka-clients-3.1.1.jar:na]
    ... 21 common frames omitted

// Here is my codes // 这是我的代码

@Injectable() export class TestResponseService { @Injectable() 导出 class TestResponseService {

constructor(private readonly producerService:ProducerService) {}

// //

async scheduleResponse(event:OrderEvent){
    
    console.log("Test response hits");
    await this.producerService.produce({
        topic:'schdule-topics',
        messages: [{
          //value: JSON.parse(JSON.stringify(event)),
          value: "Hi",

       
        
        },],
    });
    console.log("Test response below hits");

    
    return 'Hello World...!';
    
}

} }

// and My Spring boot code here // 和我的 Spring 启动代码在这里

@Service
public class Consumer{
    
    
    
    private static final Logger LOGGER = LoggerFactory.getLogger(Consumer.class);
    
    @KafkaListener(topics="${spring.kafka.topic.name}",groupId="${spring.kafka.consumer.group-id}")
    
    public void consume(){
        //LOGGER.info(String.format("Order event received in Test => %s", event.toString()));
        
        System.out.println("order ID is printing in test: ");
        
        
        
    }
    

}

Caused by: java.lang.IllegalStateException: No type information in headers and no default type provided原因:java.lang.IllegalStateException:标题中没有类型信息,也没有提供默认类型

Since it is coming from a non-Spring application, you need to tell the deserializer what type you want it to create from the JSON.由于它来自非 Spring 应用程序,因此您需要告诉反序列化器您希望它从 JSON 创建什么类型。

See the documentation: https://docs.spring.io/spring-kafka/docs/current/reference/html/#json-serde请参阅文档: https://docs.spring.io/spring-kafka/docs/current/reference/html/#json-serde

If you are configuring the deserializer via consumer properties, set如果您通过消费者属性配置反序列化器,请设置

spring.kafka.consumer.properties.spring.json.default.value.type=com.example.MyClass

Your NestJS event payload is just a String Hi , and not JSON.您的 NestJS 事件负载只是一个 String Hi ,而不是 JSON。 Therefore, use StringDeserializer rather than JsonDeserializer in the Spring consumer config.因此,在 Spring 消费者配置中使用StringDeserializer而不是JsonDeserializer

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM