ClassCastException для того же класса десериализации из потока Кафка и Avro - PullRequest
0 голосов
/ 04 июля 2019

Я сгенерировал свои классы Avro Java из схемы Avro с помощью avro-maven-plugin. Я сериализую свой класс avro в байтовый массив и записываю его в тему kafka.

Тогда у меня есть поток kafka, который пытается манипулировать данными avro, чтобы что-то сделать. В процессе десериализации я получаю ClassCastExcetion от того же класса. Я читал, что эта проблема возникает из-за другого ClassLoader, который Avro использует при резервном (новый экземпляр ClassLoader).

Есть способ заставить Avro использовать ClassLoader вызывающего абонента или что-то подобное?

KafkaStream properties

this.props = new Properties();
        this.props.put(StreamsConfig.APPLICATION_ID_CONFIG, "test");
        this.props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        this.props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
        this.props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.ByteArray().getClass());

Я использую ключ String и сериализованный байтовый массив avro, затем мне нужно вручную десериализовать полезную нагрузку avro. Я использую декодер Avro для десериализации следующим образом:

AvroPayload stp = AvroPayload.fromByteBuffer(ByteBuffer.wrap(bytes));

или даже так:

AvroPayload stp = AvroPayload.getDecoder().decode(ByteBuffer.wrap(bytes));

В первой версии, отладке, я вижу, что если я останусь в контексте сгенерированного класса avro, массив байтов будет правильно десериализован в класс AvroPayload. Возвращение этого нового экземпляра, возможно, выдает ClassCastException

1 Ответ

2 голосов
/ 05 июля 2019

Единственное решение, которое я нашел, - это поместить предложенные классы avro во внешний jar-файл и затем импортировать его.

Это не очень хорошее решение, так как требует большой конфигурации для поддержания связи между вашими схемами avro иваши сгенерированные классы, но это единственное, что я нашел.

Я настроил проект maven, который генерирует jar классов avro в каталог, без имени версии артефакта, поэтому я всегда могу импортировать последнюю версию без необходимостипоменяйте пом.

Если кто-то найдет другое решение, пожалуйста, опубликуйте его

...