春季启动启动后,不会在远程kafka上自动创建kafka主题(并在本地kafka服务器上创建)

时间:2019-03-21 09:46:28

标签: spring spring-boot apache-kafka spring-kafka

1)我在计算机上启动kafka

2)我使用配置启动我的spring boot服务器:

@Bean
public NewTopic MyTopic() {
    return new NewTopic("my-topic", 5, (short) 1);
}

@Bean
public ProducerFactory<String, byte[]> greetingProducerFactory() {
    Map<String, Object> configProps = new HashMap<>();
    configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
    configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
    configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class);
    return new DefaultKafkaProducerFactory<>(configProps);
}

@Bean
public KafkaTemplate<String, byte[]> unpMessageKafkaTemplate() {
    return new KafkaTemplate<>(greetingProducerFactory());
}

结果-服务器成功启动,并在kafka中创建my-topic

但是,如果我尝试使用远程服务器上的远程kafka进行操作-则无法创建主题。

并在日志弹簧中写入:

12:35:09.880 [                  main] [INFO ]    o.a.k.clients.admin.AdminClientConfig: [] AdminClientConfig values: 
    bootstrap.servers = [localhost:9092]

如果我将此bean添加到配置中:

@Bean
public KafkaAdmin admin() {
    Map<String, Object> configs = new HashMap<>();
    configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "remote_host:9092");
    return new KafkaAdmin(configs);
}

主题创建成功。

1)为什么会发生?

2)我必须创建KafkaAdmin吗?为什么不需要本地卡夫卡?

EDDIT

我当前的配置:

spring:
  kafka:
    bootstrap-servers: remote:9092
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringDeserializer
      value-serializer: org.apache.kafka.common.serialization.ByteArraySerializer

@Configuration
public class KafkaTopicConfig {

    @Value("${response.topics.topicName}")
    private String topicName;

    @Bean
    public NewTopic responseTopic() {
        return new NewTopic(topicName, 5, (short) 1);
    }

}

启动后,我看到:

bootstrap.servers = [remote:9092]
    client.id = 
    connections.max.idle.ms = 300000
    metadata.max.age.ms = 300000
    metric.reporters = []
    metrics.num.samples = 2
    metrics.recording.level = INFO
    metrics.sample.window.ms = 30000
    receive.buffer.bytes = 65536

...

但主题未创建

2 个答案:

答案 0 :(得分:2)

KafkaAdmin是kafka弹簧对象,用于在您的弹簧上下文中查找NewTopic对象并创建它们。如果您没有KafkaAdmin,将不会进行创建。您可以显式创建KafkaAdmin(如代码段所示),也可以通过spring kafka配置属性间接命令其创建。

KafkaAdmin非常高兴,它与您的应用程序代码的主题的生产或消费无关。

编辑

您一定有什么问题;我刚刚测试过...

spring:
  kafka:
    bootstrap-servers: remote:9092

2019-03-21 09:18:18.354  INFO 58301 --- [           main] o.a.k.clients.admin.AdminClientConfig    
        : AdminClientConfig values: 
    bootstrap.servers = [remote:9092]
    ...

答案 1 :(得分:1)

Spring Boot将自动为您配置KafkaAdmin,但它使用application.yml(或application.properties)。参见Boot properties。向下滚动到spring.kafka.bootstrap-servers=。这就是为什么它可以与localhost(默认)一起使用的原因。

您也不需要ProducerFactory或模板;引导程序将通过属性为您创建它们。