Java 使用模式注册表API验证Kafka消息
我正在实现一个生成kafka消息的过程,每个消息都应该由schema Registry验证模式。为了开发,我使用docker运行kafka和Schema Registry,我的模式由Schema Registry ui注册 看起来我的架构没有被验证,或者我缺少一些配置。我的producer类具有以下代码:Java 使用模式注册表API验证Kafka消息,java,apache-kafka,Java,Apache Kafka,我正在实现一个生成kafka消息的过程,每个消息都应该由schema Registry验证模式。为了开发,我使用docker运行kafka和Schema Registry,我的模式由Schema Registry ui注册 看起来我的架构没有被验证,或者我缺少一些配置。我的producer类具有以下代码: package br.com.xx.realtime_transformation.producers; import io.confluent.kafka.serializers.Abst
package br.com.xx.realtime_transformation.producers;
import io.confluent.kafka.serializers.AbstractKafkaAvroSerDeConfig;
import io.confluent.kafka.serializers.KafkaAvroSerializer;
import org.apache.avro.generic.GenericRecord;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.errors.SerializationException;
import org.apache.kafka.common.serialization.StringSerializer;
import java.util.Properties;
import java.util.UUID;
public class KafkaEventProducer {
private final String bootstrapServers;
private final String schemaRegistryUrl;
private final KafkaProducer<String, GenericRecord> kafkaProducer;
public KafkaEventProducer(String bootstrapServers, String schemaRegistryUrl) {
this.bootstrapServers = bootstrapServers;
this.schemaRegistryUrl = schemaRegistryUrl;
this.kafkaProducer = getProducer();
}
private KafkaProducer<String, GenericRecord> getProducer() {
Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, this.bootstrapServers);
props.put(ProducerConfig.ACKS_CONFIG, "all");
props.put(ProducerConfig.RETRIES_CONFIG, 0);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, KafkaAvroSerializer.class);
props.put(AbstractKafkaAvroSerDeConfig.AUTO_REGISTER_SCHEMAS, false);
props.put(AbstractKafkaAvroSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, this.schemaRegistryUrl);
return new KafkaProducer<>(props);
}
public void send(String topic, GenericRecord event) {
try {
String key = UUID.randomUUID().toString();
final ProducerRecord producerRecord = new ProducerRecord<>(topic, key, event);
this.kafkaProducer.send(producerRecord);
} catch (final SerializationException e) {
e.printStackTrace();
}
}
}
package br.com.xx.realtime\u transformation.producers;
导入io.confluent.kafka.serializers.AbstractKafkaAvroSerDeConfig;
导入io.confluent.kafka.Serializer.KafkaAvroSerializer;
导入org.apache.avro.generic.GenericRecord;
导入org.apache.kafka.clients.producer.KafkaProducer;
导入org.apache.kafka.clients.producer.ProducerConfig;
导入org.apache.kafka.clients.producer.ProducerRecord;
导入org.apache.kafka.common.errors.SerializationException;
导入org.apache.kafka.common.serialization.StringSerializer;
导入java.util.Properties;
导入java.util.UUID;
公共级卡夫卡文特制作人{
私有最终字符串引导服务器;
私有最终字符串schemaRegistryUrl;
私人最终卡夫卡制作人卡夫卡制作人;
公共KafkaEventProducer(字符串引导服务器、字符串模式注册表){
this.bootstrapserver=bootstrapserver;
this.schemaRegistryUrl=schemaRegistryUrl;
this.kafkaProducer=getProducer();
}
私人卡夫卡制作人(getProducer){
Properties props=新属性();
put(ProducerConfig.BOOTSTRAP\u SERVERS\u CONFIG,this.bootstrapserver);
props.put(ProducerConfig.ACKS_CONFIG,“all”);
props.put(ProducerConfig.RETRIES\u CONFIG,0);
put(ProducerConfig.KEY\u SERIALIZER\u CLASS\u CONFIG,StringSerializer.CLASS);
put(ProducerConfig.VALUE\u SERIALIZER\u CLASS\u CONFIG,KafkaAvroSerializer.CLASS);
put(AbstractKafkaAvroSerDeConfig.AUTO_REGISTER_SCHEMAS,false);
put(AbstractKafkaAvroSerDeConfig.SCHEMA\u REGISTRY\u URL\u CONFIG,this.schemaRegistryUrl);
归还新卡夫卡制作人(道具);
}
公共void发送(字符串主题,GenericRecord事件){
试一试{
字符串键=UUID.randomUUID().toString();
最终产品记录产品记录=新产品记录(主题、关键、事件);
这个.kafkaProducer.send(producerRecord);
}捕获(最终序列化异常e){
e、 printStackTrace();
}
}
}
大多数情况下,我会收到一个错误,比如“Schema not found”,当没有引发此异常时,我的消息不会被验证,它只是将消息发送到另一个主题
是否缺少任何类型的配置?Kafka Producer使用模式注册表,而不使用模式注册表 没有模式注册表-下面是没有模式注册表的卡夫卡制作人的示例 使用模式注册表
schema.registry.url
参数只是指向存储模式的位置。
我们需要提供如下所示的模式定义。您没有提供架构定义,而是使用架构注册表,因此您遇到了问题
{
"namespace": "com.example",
"type": "record",
"name": "Employee",
"doc" : "Represents an Employee at a company",
"fields": [
{"name": "firstName", "type": "string", "doc": "The persons given name"},
{"name": "lastName", "type": "string"},
{"name": "age", "type": "int", "default": -1},
{"name": "emails", "default":[], "type":{"type": "array", "items": "string"}},
{"name": "phoneNumber", "type": "string"}
]
}
Schema Registry的工作流程如下所示
您可以在下面的URL上找到详细的解释。
我不确定我是否理解这个问题,但您似乎在问关于模式验证的问题 这是