Отправить пользовательские объекты Java в раздел Kafka

у меня есть свой пользовательский объект Java и я хочу использовать JVM во встроенной сериализации, чтобы отправить его в тему Кафки, но сериализация завершается с ошибкой ниже

org.апаш.Кафка.общий.ошибки.SerializationException: не удается преобразовать значение класса com.весна.Кафка.Грузоподъемность в классе орг.апаш.Кафка.общий.сериализация.ByteArraySerializer, указанных в значение.сериализатор

нагрузки.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;
    }

}

во время моего создание производителя, у меня есть следующие свойства set

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

мой вызов отправки, как показано ниже

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

как правильно отправить пользовательский объект java через производителя в тему Кафки ?

2 ответов


у нас есть 2 варианта, как показано ниже

1) Если мы намерены отправить пользовательские объекты java производителю, нам нужно создать сериализатор, который реализует org.апаш.Кафка.общий.сериализация.Сериализатор и передайте этот класс сериализатора во время создания вашего производителя

ссылка код

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() {

    }
}

и установите сериализатор значений соответственно

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

2) нет необходимости создавать пользовательский класс сериализатора. Использовать существующий ByteArraySerializer, но во время отправки следуйте процессу

Java Object - > String (предпочтительно JSON represenation вместо toString) - >byteArray


Если вы используете ByteArraySerializer, вам нужно создать экземпляр Byte [] producer.

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

а затем при создании передать байт[] после сериализации или какой-либо другой метод,например,

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

Если вы передаете только объект полезной нагрузки производителю, то будет лучше иметь ключевой сериализатор и сериализатор значений как все, что вы собираетесь передать, и при чтении вам нужно прочитать из этих данных.

хорошая практика использовать Сериализуемое и ByteArraySerializer / ByteArrayDeserializer.