简体   繁体   English

将自定义Java对象发送到Kafka主题

[英]Send Custom Java Objects to Kafka Topic

I have my custom Java Object and wish to leverage JVM's in built serialization to send it to a Kafka topic, but serialization fails with below error 我有我的自定义Java对象,并希望利用内置序列化中的JVM将其发送到Kafka主题,但序列化失败,出现以下错误

org.apache.kafka.common.errors.SerializationException: Can't convert value of class com.spring.kafka.Payload to class org.apache.kafka.common.serialization.ByteArraySerializer specified in value.serializer org.apache.kafka.common.errors.SerializationException:无法将类com.spring.kafka.Payload的值转换为value.serializer中指定的类org.apache.kafka.common.serialization.ByteArraySerializer

Payload.java Payload.java

public class Payload implements Serializable {

    private static final long serialVersionUID = 123L;

    private String name="vinod";

    private int anInt = 5;

    private Double aDouble = new Double("5.0");

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAnInt() {
        return anInt;
    }

    public void setAnInt(int anInt) {
        this.anInt = anInt;
    }

    public Double getaDouble() {
        return aDouble;
    }

    public void setaDouble(Double aDouble) {
        this.aDouble = aDouble;
    }

}

During my creation of producer, I have the following properties set 在我创建生产者期间,我设置了以下属性

<entry key="key.serializer"
                       value="org.apache.kafka.common.serialization.ByteArraySerializer" />
                <entry key="value.serializer"
                       value="org.apache.kafka.common.serialization.ByteArraySerializer" />

My send invoke is as below 我的发送调用如下

kafkaProducer.send(new ProducerRecord<String, Payload>("test", new Payload()));

What is correct way to send a custom java object through a producer to a kafka topic ? 通过生产者将自定义java对象发送到kafka主题的正确方法是什么?

We have 2 Options as listed below 我们有2个选项,如下所示

1) If we intend to send custom java objects to producer, We need to create a serializer which implements org.apache.kafka.common.serialization.Serializer and pass that Serializer class during creation of your producer 1)如果我们打算向生产者发送自定义java对象,我们需要创建一个实现org.apache.kafka.common.serialization.Serializer的序列化程序,并在创建生成器期间传递该Serializer类

Code Reference below 代码参考如下

public class PayloadSerializer implements org.apache.kafka.common.serialization.Serializer {

    public void configure(Map map, boolean b) {

    }

    public byte[] serialize(String s, Object o) {

       try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(o);
            oos.close();
            byte[] b = baos.toByteArray();
            return b;
        } catch (IOException e) {
            return new byte[0];
        }
    }

    public void close() {

    }
}

And set the value serializer accordingly 并相应地设置值序列化器

<entry key="value.serializer"
                       value="com.spring.kafka.PayloadSerializer" />

2) No need to create custom serializer class. 2)无需创建自定义序列化程序类。 Use the existing ByteArraySerializer, but during send follow the process 使用现有的ByteArraySerializer,但在发送过程中请遵循该过程

Java Object -> String (Preferrably JSON represenation instead of toString)->byteArray Java对象 - >字符串(优选JSON表示而不是toString) - > byteArray

Since you are using ByteArraySerializer ,you need to instantiate a byte[] producer. 由于您使用的是ByteArraySerializer ,因此需要实例化byte []生成器。

Producer<byte[],byte[]> producer = new KafkaProducer<>(props);

and then while producing pass the byte[] after serializing or some other method,for instance, 然后在生成时,在序列化或其他方法之后传递byte [],例如,

producer.send(new ProducerRecord<byte[],byte[]>("test", new Payload().toString().getBytes()));

If you are passing just a Payload Object to the producer then it will be better to have key serializer and value serializer as whatever you intend to pass and while reading you need to read from that data. 如果您只是将一个Payload对象传递给生产者,那么最好将密钥序列化器和值序列化器作为您想要传递的任何内容,并且在读取时需要从该数据中读取。

It is good practice to use Serializable and ByteArraySerializer/ByteArrayDeserializer. 使用Serializable和ByteArraySerializer / ByteArrayDeserializer是一种好习惯。

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

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