KafkaStream不使用Consumed.with()中给定的serde,而是使用默认的serde

时间:2019-06-13 11:52:37

标签: apache-kafka-streams

我通过以下方法从kafka创建了Serde消费

import org.apache.kafka.connect.json.JsonDeserializer;
import org.apache.kafka.connect.json.JsonSerializer;

final Deserializer<JsonNode> jsonDeserializer = new JsonDeserializer();
final Serializer<JsonNode> jsonSerializer = new JsonSerializer();
final Serde<JsonNode> jsonNodeSerde = Serdes.serdeFrom(jsonSerializer, jsonDeserializer);

final StreamsBuilder builder = new StreamsBuilder();

final KStream<String, JsonNode> eventStream = builder
                .stream("my-test-1",
                        Consumed.with(Serdes.String(), jsonNodeSerde)

但仍然收到序列化错误:

Caused by: org.apache.kafka.streams.errors.StreamsException: A serializer (key: org.apache.kafka.common.serialization.StringSerializer / value: org.apache.kafka.common.serialization.ByteArraySerializer) is not compatible to the actual key or value type (key type: java.lang.String / value type: com.fasterxml.jackson.databind.node.ObjectNode). Change the default Serdes in StreamConfig or provide correct Serdes via method parameters.

由于已经提供了Consumed.with(),为什么仍使用默认Serde?作为这里写的答案,这应该行得通吗? https://stackoverflow.com/a/48832957/3952994

1 个答案:

答案 0 :(得分:2)

是的,问题在于您的数据与Serdes不匹配。

A serializer (key: org.apache.kafka.common.serialization.StringSerializer /
              value: org.apache.kafka.common.serialization.ByteArraySerializer)
is not compatible to the actual key or value type
             (key type: java.lang.String /
              value type: com.fasterxml.jackson.databind.node.ObjectNode).

但是,错误消息指出问题是由于对数据进行序列化(即Kafka Streams尝试写入某个地方的数据)引起的。

您的带有Consumed的代码段是关于反序列化,因此是读取数据。因此,问题似乎不是由您在问题中共享的代码段引起的,而是由Java文件中可能位于更下方的代码(问题中未显示)引起的。 (顺便说一句,如果您提供了错误的完整堆栈跟踪信息,将会有所帮助。)