卡夫卡消费者错误

时间:2018-06-25 12:15:17

标签: apache-kafka kafka-consumer-api kafka-producer-api spring-kafka

我正在使用kafka产品和Spring kafka用户。我正在使用Json序列化器和反序列化器。每当我尝试从主题读取使用者中的消息时,都会出现以下错误:

org.apache.kafka.common.errors.SerializationException: Error deserializing key/value for partition fan_topic-0 at offset 154. If needed, please seek past the record to continue consumption.
Caused by: java.lang.IllegalStateException: No type information in headers and no default type provided

我既没有在生产者中也没有在消费者中配置有关标头的任何东西。我在这里想念什么?

2 个答案:

答案 0 :(得分:3)

我相信您会错过这样一个事实,必须在 public static List<int> pageRangeToList(string pageRg, int Nmax = 0) { List<int> ls = new List<int>(); int lb,ub,i; foreach (string ss in pageRg.Split(',')) { if(int.TryParse(ss,out lb)){ ls.Add(Math.Abs(lb)); } else { var subls = ss.Split('-').ToList(); lb = (int.TryParse(subls[0],out i)) ? i : 0; ub = (int.TryParse(subls[1],out i)) ? i : Nmax; ub = ub > 0 ? ub : lb; // if ub=0, take 1 value of lb for(i=0;i<=Math.Abs(ub-lb);i++) ls.Add(lb<ub? i+lb : lb-i); } } Nmax = Nmax > 0 ? Nmax : ls.Max(); // real Nmax return ls.Where(s => s>0 && s<=Nmax).ToList(); } 上配置JsonDeserializer并使用适当的默认类型进行反序列化,而不是在Kafka属性中。

所有信息均在文档中显示:https://docs.spring.io/spring-kafka/docs/2.1.7.RELEASE/reference/html/_reference.html#serdes

答案 1 :(得分:0)

只需添加以上答案,

以下更改为我解决了。

config.put(JsonSerializer.ADD_TYPE_INFO_HEADERS, false);

添加

return new DefaultKafkaConsumerFactory<>(config, new StringDeserializer(), new JsonDeserializer<>(String.class));

代替

return new DefaultKafkaConsumerFactory<String, String>(config);

供参考,

deserialize中的以下方法期望标题,而“ Assert.state..”抛出IllegalStateException

 @Override
        public T deserialize(String topic, Headers headers, byte[] data) {
            JavaType javaType = this.typeMapper.toJavaType(headers);
            if (javaType == null) {
                Assert.state(this.targetType != null, "No type information in headers and no default type provided");
                return deserialize(topic, data);
            }
            else {
                try {
                    return this.objectMapper.readerFor(javaType).readValue(data);
                }
                catch (IOException e) {
                    throw new SerializationException("Can't deserialize data [" + Arrays.toString(data) +
                            "] from topic [" + topic + "]", e);
                }
            }
        }