KafkaProducer总是为JavaAPI中的模式注册表选择localhost:8081
KafkaProducer无法拾取其属性中定义的KafkaProducer总是为JavaAPI中的模式注册表选择localhost:8081,java,apache-kafka,kafka-producer-api,confluent-schema-registry,Java,Apache Kafka,Kafka Producer Api,Confluent Schema Registry,KafkaProducer无法拾取其属性中定义的schema.registry.url 正如我们在下面的屏幕截图中所看到的,模式注册表url是一个虚拟url // variable which is being debugged private KafkaProducer<K, V> kafkaFullAckProducer; 上述两个证明是在一次节目中拍摄的。正如我们可以清楚地看到的那样,eclipse调试期间的schmearegistry url提示是123.1.1.1,但在我
schema.registry.url
正如我们在下面的屏幕截图中所看到的,模式注册表url是一个虚拟url
// variable which is being debugged
private KafkaProducer<K, V> kafkaFullAckProducer;
上述两个证明是在一次节目中拍摄的。正如我们可以清楚地看到的那样,eclipse调试期间的schmearegistry url提示是123.1.1.1,但在我的失败日志中是这样的
因此,在我的其他环境中,我无法运行其他分配的schema.registry.url,因为它总是使用
代码托管在一台机器上,而模式注册表/代理位于另一台机器上
注册表是在开发环境中启动的。/confluent start
我的制作人代码:
private KafkaProducer<K, V> kafkaFullAckProducer;
MonitoringConfig config;
public void produceWithFullAck(String brokerTopic, V genericRecord) throws Exception {
// key is null
ProducerRecord<K, V> record = new ProducerRecord<K, V>(brokerTopic, genericRecord);
try {
Future<RecordMetadata> futureHandle = this.kafkaFullAckProducer.send(record, (metadata, exception) -> {
if (metadata != null) {
log.info("Monitoring - Sent record(key=" + record.key() + " value=" + record.value()
+ " meta(partition=" + metadata.partition() + " offset=" + metadata.offset() + ")");
}
});
RecordMetadata recordMetadata = futureHandle.get();
} catch (Exception e) {
if (e.getCause() != null)
log.error("Monitoring - " + e.getCause().toString());
throw new RuntimeException(e.getMessage(), e.getCause());
} finally {
// initializer.getKafkaProducer().close();
}
}
@PostConstruct
private void initialize() {
Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, config.getBrokerList());
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, KafkaAvroSerializer.class.getName());
// kafkaProps.put("value.serializer",
// "org.apache.kafka.common.serialization.ByteArraySerializer");
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, CustomAvroSerializer.class.getName());
props.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, Constants.COMPRESSION_TYPE_CONFIG);
props.put(ProducerConfig.RETRIES_CONFIG, config.getProducerRetryCount());
props.put("schema.registry.url", config.getSchemaRegistryUrl()); // the url is coming right here
props.put("acks", "all");
kafkaFullAckProducer = new KafkaProducer<K, V>(props);
}
application.properties:
kafka.zookeeper.connect=http://localhost:2181
kafka.broker.list=http://localhost:9092
consumer.timeout.ms=1000
producer.retry.count=1
schema.registry.url=http://123.1.1.1:8082
自定义avro序列化程序是我需要弃用的东西,并使用前面讨论的方法,但我确信这不是问题的原因
以下是主机的详细信息:
主机1:有这个Java服务和Kafka连接,错误日志就在这里。
主机2:具有Kafka、Schema Registry和Zookeper。您使用的是自定义序列化程序,作为
序列化程序
实现的一部分,您必须定义接受映射的配置
方法
在该方法中,我猜您定义了一个字段,但没有从配置映射中提取在生产者级别添加的url属性,因此它将默认使用其他本地主机地址
汇合代码需要单步执行四个类,但您将看到序列化程序实现,然后查看单独的配置类以及抽象序列化程序和SerDe父类。在中,我曾指出,我认为您不需要实际使用自定义Avro序列化程序,因为您似乎在重做AbstractKafkaSerializer类所做的事情,您正在使用自定义序列化程序,并且作为
序列化程序实现的一部分,您必须定义一个接受映射的configure
方法
在该方法中,我猜您定义了一个字段,但没有从配置映射中提取在生产者级别添加的url属性,因此它将默认使用其他本地主机地址
汇合代码需要单步执行四个类,但您将看到序列化程序实现,然后查看单独的配置类以及抽象序列化程序和SerDe父类。从中,我曾指出,我认为您不需要实际使用自定义Avro序列化程序,因为您似乎正在重做AbstractKafkaSerializer类所做的事情一切都在哪里运行?同一台机器?不同的机器?你是怎么开始注册的?你能显示它的配置文件吗?请帮助我们使用,包括您的producer codeSure,重现问题,但我的观点是,例如,在Confluent序列化程序中,它将注册表默认为localhost。这就是为什么我想看看你的。。。如果您想弃用自己的,那么现在正是一个好时机,这样您以前的帖子就不会显示schema.registry.url
实际从属性中取出并用于定义CachedSchemaRegistryClient
类的位置。。。换句话说,您的属性有字符串,当然,这显然是有效的,但这还不足以覆盖注册表clientAgain的默认行为。请编辑您的问题以包括整个序列化程序类,不要链接到单独的帖子。我个人觉得在一个主题中实现单个架构更容易。JSON有效负载对于网络流量优化来说是浪费。如果是度量,不确定除了应用程序/度量名称、供以后筛选的可选标记列表、时间戳和实际度量值之外,您还需要什么?同一台机器?不同的机器?你是怎么开始注册的?你能显示它的配置文件吗?请帮助我们使用,包括您的producer codeSure,重现问题,但我的观点是,例如,在Confluent序列化程序中,它将注册表默认为localhost。这就是为什么我想看看你的。。。如果您想弃用自己的,那么现在正是一个好时机,这样您以前的帖子就不会显示schema.registry.url
实际从属性中取出并用于定义CachedSchemaRegistryClient
类的位置。。。换句话说,您的属性有字符串,当然,这显然是有效的,但这还不足以覆盖注册表clientAgain的默认行为。请编辑您的问题以包括整个序列化程序类,不要链接到单独的帖子。我个人觉得在一个主题中实现单个架构更容易。JSON有效负载对于网络流量优化来说是浪费。如果是度量,则不确定除了应用程序/度量名称、供以后筛选的可选标记列表、时间戳和实际度量值之外,还需要什么。我只是在等待访问自定义avro序列化程序的代码。应该是这样。惊人的调试技巧。我只是在等待访问自定义avro序列化程序的代码。应该是这样。
@Value("${kafka.zookeeper.connect}")
private String zookeeperConnect;
@Value("${kafka.broker.list}")
private String brokerList;
@Value("${consumer.timeout.ms:1000}")
private String consumerTimeout;
@Value("${producer.retry.count:1}")
private String producerRetryCount;
@Value("${schema.registry.url}")
private String schemaRegistryUrl;
@Value("${consumer.enable:false}")
private boolean isConsumerEnabled;
@Value("${consumer.count.thread}")
private int totalConsumerThread;
}
kafka.zookeeper.connect=http://localhost:2181
kafka.broker.list=http://localhost:9092
consumer.timeout.ms=1000
producer.retry.count=1
schema.registry.url=http://123.1.1.1:8082