[英]Send byte array and derserialize it as Avro record with kafka
我正在将与 Avro Record 对应的字节数组发送到 kafka。
制作人:
props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "broker-address");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, KafkaAvroSerializer.class);
props.put(ProducerConfig.CLIENT_ID_CONFIG, "Kafka Avro ClientOrderRequest Producer");
props.put("schema.registry.url", "schema-registry address");
KafkaProducer<String, ClientOrderRequest> producerRequest = new KafkaProducer<>(props);
while (true) {
ClientOrderRequest clientOrderRequest = createClientOrderRequest();
byte[] bytes = toByteArray(clientOrderRequest);
final ProducerRecord<String, byte[]> producerOrderRequest = new ProducerRecord<>("client-order-request",
"ClientOrderRequest-" + calendar.getTimeInMillis(), bytes);
producerRequest.send(producerOrderRequest);
producerRequest.flush();
System.out.println("Produced 1 record.");
Thread.sleep(2000);
}
消费者:
props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "broker-address");
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, KafkaAvroDeserializer.class);
props.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG, "true");
props.put("schema.registry.url", "schema-registry address");
props.put(ConsumerConfig.GROUP_ID_CONFIG, "events-group-3");
KafkaConsumer<String, ClientOrderRequest> clientOrderRequestConsumer = new KafkaConsumer<>(props);
clientOrderRequestConsumer.subscribe(Collections.singletonList("client-order-request"));
while (true) {
ConsumerRecords<String, ClientOrderRequest> records = clientOrderRequestConsumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, ClientOrderRequest> record : records) {
String key = record.key();
ClientOrderRequest value = record.value();
System.out.println(key);
System.out.println(value);
}
}
}
生产者能够将字节数组发送到主题。 但是消费者无法反序列化它。 我有错误:
B 无法转换为 com.swissquote.eforex.generated.avro.trading.ClientOrderRequest
当我生成消息时,客户端订单请求值主题已在模式注册表中注册。 我知道我发送了一个字节数组,并且 kafka/schema-registry 需要一个 Avro 记录,但我希望它能够反序列化它。
如果无法使用简单的 AvroKafkaSerializer,我是否应该实现自己的序列化程序?
什么是toByteArray
?
您不需要手动序列化您的数据。 这就是序列化器 class 的全部意义所在。不清楚为什么你从上一个问题中改变了这个
ClientOrderRequest clientOrderRequest = createClientOrderRequest();
final ProducerRecord<String, ClientOrderRequest> producerOrderRequest = new ProducerRecord<>("client-order-request",
"ClientOrderRequest-" + calendar.getTimeInMillis(), clientOrderRequest);
producerRequest.send(producerOrderRequest);
producerRequest.flush();
当您使用 KafkaAvroSerializer.class 发送字节数组时,它会发送{"type": "bytes"}
的 Avro object,而不是您的自定义记录
如果你真的想直接发送字节 arrays,你可以使用ByteArraySerializer
,但这会绕过模式注册表
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.