Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用模式注册表API验证Kafka消息_Java_Apache Kafka - Fatal编程技术网

Java 使用模式注册表API验证Kafka消息

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

我正在实现一个生成kafka消息的过程,每个消息都应该由schema Registry验证模式。为了开发,我使用docker运行kafka和Schema Registry,我的模式由Schema Registry ui注册

看起来我的架构没有被验证,或者我缺少一些配置。我的producer类具有以下代码:

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上找到详细的解释。

我不确定我是否理解这个问题,但您似乎在问关于模式验证的问题

这是