简体   繁体   English

如何在kafka制作人中切换到自定义编码器?

[英]How to switch to custom encoder in kafka producer?

I am getting the following error when I try to use string as key in kafka topic. 当我尝试在kafka主题中使用字符串作为键时,我收到以下错误。

18/05/14 17:08:26 ERROR async.DefaultEventHandler: Error serializing message for topic my_topic
java.lang.ClassCastException: java.lang.String cannot be cast to [B
    at kafka.serializer.DefaultEncoder.toBytes(Encoder.scala:34)
    at kafka.producer.async.DefaultEventHandler$$anonfun$serialize$1.apply(DefaultEventHandler.scala:130)
    at kafka.producer.async.DefaultEventHandler$$anonfun$serialize$1.apply(DefaultEventHandler.scala:127)
    at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
    at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47)
    at kafka.producer.async.DefaultEventHandler.serialize(DefaultEventHandler.scala:127)
    at kafka.producer.async.DefaultEventHandler.handle(DefaultEventHandler.scala:53)
    at kafka.producer.async.ProducerSendThread.tryToHandle(ProducerSendThread.scala:105)
    at kafka.producer.async.ProducerSendThread$$anonfun$processEvents$3.apply(ProducerSendThread.scala:88)
    at kafka.producer.async.ProducerSendThread$$anonfun$processEvents$3.apply(ProducerSendThread.scala:68)
    at scala.collection.immutable.Stream.foreach(Stream.scala:547)
    at kafka.producer.async.ProducerSendThread.processEvents(ProducerSendThread.scala:67)
    at kafka.producer.async.ProducerSendThread.run(ProducerSendThread.scala:45)

It seems like the issue is that the default encoder 似乎问题是默认编码器

public class DefaultEncoder implements Encoder<byte[]> 

does not support string to byte 不支持字符串到字节

public byte[] toBytes(byte[] value) {
    return value;
}

What is the proper way of providing a custom encoder to the producer? 向制作人提供自定义编码器的正确方法是什么?

And do I have to change at the consumer side as well? 我是否也必须在消费者方面进行改变?

On the Producer/Consumer you can specify a different serializer rather than the default ByteArraySerializer, Here you can find the available serializers for version 1.1.0 , or you can specify your own. 在Producer / Consumer上,您可以指定不同的序列化程序而不是默认的ByteArraySerializer, 在这里您可以找到1.1.0版的可用序列化程序,或者您可以指定自己的序列化程序。

In general if you are sending/receiving Strings or Json you can just use the default org.apache.kafka.common.serialization.StringSerializer and org.apache.kafka.common.serialization.StringDeserializer . 通常,如果您要发送/接收字符串或Json,则可以使用默认的org.apache.kafka.common.serialization.StringSerializerorg.apache.kafka.common.serialization.StringDeserializer For the producer/consumer the properties are: 对于生产者/消费者,属性是:

private void configureProducer() {
    Properties props = new Properties();
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
}

private void configureConsumer() {
    Properties props = new Properties();
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringDeserializer");
    props.put("value.serializer", "org.apache.kafka.common.serialization.StringDeserializer");
}

Properties producerProps = configureProducer();
KafkaProducer<String, String> producer = new KafkaProducer<>(producerProps);
Properties consumerProps = configureConsumer();
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(consumerProps);

If you want to send your own custom bean then either convert it to json and use the default StringSerializer/Deserializer or build your own serialization/deserialization classes. 如果要发送自己的自定义bean,则将其转换为json并使用默认的StringSerializer / Deserializer或构建自己的序列化/反序列化类。 You can see an example using json strings with spring boot here 你可以在这里看到一个使用json字符串和spring boot的例子

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

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