Отправить пользовательские объекты 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.