2

Our Spring boot app is reading messages from a Kafka topic:

  @KafkaListener(topics = "${topicName}")
  public void receive(@Payload Cat cat, @Headers MessageHeaders headers){
      ...
  }

All is cool when in the topic there are JSON messages that can be deserialized into Cat object.

But when the topic contains messages that can't, we are facing a loop where it seems like:

  1. the app is trying to read the message
  2. fails to do so
  3. can't inform the Kafka about the failure and hence
  4. can't skip that message and continue to the rest of the messages

org.apache.kafka.common.errors.SerializationException: Error deserializing key/value for partition sfgateway-0 at offset 0. If needed, please seek past the record to continue consumption. Caused by: org.apache.kafka.common.errors.SerializationException: Can't deserialize data [[10, 15, 12, 108, 97, 111, ...]] from topic cats Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'miaow': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at [Source: (byte[])"miaow - I'm not a JSON"; line: 1, column: 4] at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1840) at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:722) at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._reportInvalidToken(UTF8StreamJsonParser.java:3556) at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleUnexpectedValue(UTF8StreamJsonParser.java:2651) at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._nextTokenNotInObject(UTF8StreamJsonParser.java:856) at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:753) at com.fasterxml.jackson.databind.ObjectReader._initForReading(ObjectReader.java:357) at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1704) at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1282) at org.springframework.kafka.support.serializer.JsonDeserializer.deserialize(JsonDeserializer.java:438) at org.apache.kafka.clients.consumer.internals.Fetcher.parseRecord(Fetcher.java:1268) at org.apache.kafka.clients.consumer.internals.Fetcher.access$3600(Fetcher.java:124) at org.apache.kafka.clients.consumer.internals.Fetcher$PartitionRecords.fetchRecords(Fetcher.java:1492) at org.apache.kafka.clients.consumer.internals.Fetcher$PartitionRecords.access$1600(Fetcher.java:1332) at org.apache.kafka.clients.consumer.internals.Fetcher.fetchRecords(Fetcher.java:645) at org.apache.kafka.clients.consumer.internals.Fetcher.fetchedRecords(Fetcher.java:606) at org.apache.kafka.clients.consumer.KafkaConsumer.pollForFetches(KafkaConsumer.java:1263) at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1225) at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1201) at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doPoll(KafkaMessageListenerContainer.java:982) at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.pollAndInvoke(KafkaMessageListenerContainer.java:938) at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:890) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.lang.Thread.run(Thread.java:748)

  kafka:
    consumer:
       auto-offset-reset: latest

How to force the app to skip this message?

riorio
  • 6,500
  • 7
  • 47
  • 100
  • What is the commit strategy you use in the consumer? Which library do you use for consuming the messages? – Keerthivasan Dec 26 '19 at 08:32
  • Auto offset reset only applies when the group doesn't have any stored offsets. Also, the ultimate solution should be to lock down the topic with ACLs, then tell the producer to fix their data types, then give them credentials to produce to the topic once you agree on a contract... Or you can just use String deserailizer and handle JSON parsing and error handling yourself – OneCricketeer Dec 26 '19 at 13:12

0 Answers0