【问题标题】:How do I externalize the properties of KAFKA into a different class and call it to the main class?如何将 KAFKA 的属性外部化到不同的类中并将其调用到主类中?
【发布时间】:2021-09-30 05:03:38
【问题描述】:

我一直在尝试使用抽象 OOP 来外部化属性代码,这样我就可以将它调用到生产者类,但我似乎无法调用它。这是代码,任何帮助将不胜感激。

public class Producer{

    private static final Logger logger = LogManager.getLogger(Producer.class);
    public static void main(String[] args) {
        logger.info("Creating Kafka Producer...");

        KafkaProducer<Integer, String> producer = new KafkaProducer<>(PropConfigs().prodProps());

        logger.info("Start sending messages...");

        for (int i = 1; i <= AppConfigs.numEvents; i++) {
            producer.send(new ProducerRecord<>(AppConfigs.topicName, i, "Message " + i + " Test"), new Callback() {
                @Override
                public void onCompletion(RecordMetadata recordMetadata, Exception e) {
                    if(e == null){
                        logger.info("\nReceived metadata" + " Topic:" + recordMetadata.topic() + " Partition: " + recordMetadata.partition() + " Offset: " + recordMetadata.offset() + " Time: " + recordMetadata.timestamp() + "\n");
                    } else {
                        logger.error("Error", e);
                    }
                }
            });
        }

        logger.info("Finished - Closing Kafka Producer.");
        producer.flush();
        producer.close();

    }
}

我想将所有 props.setProperty 转移到不同的类,然后将其调用到生产者类。这就是我想做的:

package org.timothy.producer.common;

import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.IntegerSerializer;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;

public class PropConfigs {

    public static Properties prodProps(){
        Properties props = new Properties();
        props.setProperty(ProducerConfig.CLIENT_ID_CONFIG, AppConfigs.applicationID);
        props.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, AppConfigs.bootstrapServers);
        props.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, IntegerSerializer.class.getName());
        props.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        props.setProperty(ProducerConfig.ACKS_CONFIG, "all");
        props.setProperty(ProducerConfig.RETRIES_CONFIG, "3");
        props.setProperty(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, "5");

        return new Properties(props);
    }

}

我怎样才能把它称为主类?或者也许将其应用于: 属性 props = new Properties(); KafkaProducer producer = new KafkaProducer(props);

【问题讨论】:

  • 你只需要让ProdProps() 创建一个新的Properties 实例并返回它,如果我理解你想要做的正确的话。
  • 我试过了,但是 KafkaProducer producer = new KafkaProducer(props);从主类无法识别道具。既然已经外化了

标签: java oop intellij-idea apache-kafka abstraction


【解决方案1】:
 KafkaProducer<Integer, String> producer = new KafkaProducer<>((new PropConfigs()).prodProps()); 

或者将它们设为静态...

 KafkaProducer<Integer, String> producer = new KafkaProducer<>(PropConfigs.prodProps()); 

https://github.com/apache/kafka/blob/trunk/examples/src/main/java/kafka/examples/Producer.java

【讨论】:

  • 我更新了,你可以看看吗?我仍然收到错误消息。
  • 如果您将其设为静态,则无需设置“新”
  • 是的,错误消失了。谢谢,但是..当我运行程序时,它不会调用另一个类的属性。它返回一个错误“缺少所需的配置“key.serializer”,它没有默认值”。出现此错误是因为需要props.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, IntegerSerializer.class.getName());
  • (ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, IntegerSerializer.class); (ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
  • 我得到一个错误:'java.util.Properties' 中的'setProperty(java.lang.String, java.lang.String)' 不能应用于'(java.lang.String, java .lang.Class)'。我尝试添加 String.valueOf,然后运行生产者类,但它仍然不起作用。仍然缺少所需的配置“key.serializer”
猜你喜欢
  • 2021-09-30
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
相关资源
最近更新 更多