public ConfluentProtocolHandler() { super(SerDesProtocolHandlerRegistry.CONFLUENT_VERSION_PROTOCOL, new ConfluentAvroSerDesHandler()); }
private DatumReader getDatumReader(Schema writerSchema, Schema readerSchema, boolean useSpecificAvroReader) { if (useSpecificAvroReader) { if (readerSchema == null) { readerSchema = this.getReaderSchema(writerSchema); } return new SpecificDatumReader(writerSchema, readerSchema); } else { return readerSchema == null ? new GenericDatumReader(writerSchema) : new GenericDatumReader(writerSchema, readerSchema); } }
@Override public Object handlePayloadDeserialization(InputStream payloadInputStream, Schema writerSchema, Schema readerSchema, boolean useSpecificAvroReader) { Object deserializedObj; try { if (Schema.Type.BYTES.equals(writerSchema.getType())) { // serializer writes byte array directly without going through avro encoder layers. deserializedObj = IOUtils.toByteArray(payloadInputStream); } else { DatumReader datumReader = getDatumReader(writerSchema, readerSchema, useSpecificAvroReader); deserializedObj = datumReader.read(null, DecoderFactory.get().binaryDecoder(payloadInputStream, null)); } } catch (IOException e) { throw new AvroRetryableException("Error deserializing Avro message for id " + writerSchema, e); } catch (RuntimeException e) { // avro deserialization may throw AvroRuntimeException, NullPointerException, etc throw new AvroException("Error deserializing Avro message for id " + writerSchema, e); } return deserializedObj; }