首页 > 解决方案 > 嵌入式 Kafka 代理 IP 未在属性文件中解析

问题描述

我面临一个问题,即我的 KafkaProducerConfig获得无效bootstrap.servers值,因为我的单元测试@PropertySource没有解析该spring.embedded.kafka.brokers属性。当我将生产者配置转储到日志时,我得到以下信息:

acks = 0
batch.size = 10000
bootstrap.servers = [${spring.embedded.kafka.brokers}]
...

显然,该属性没有得到解决。假设我有以下嵌入式 Kafka 测试。

@EmbeddedKafka
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
@RunWith(SpringRunner.class)
public class EmbeddedKafkaTest {

    @Value("${spring.embedded.kafka.brokers}")
    private String embeddedKafkaBrokers;

    @Test
    public void test(){}

    @SpringBootConfiguration
    @PropertySource("classpath:kafkaTestProps.properties")
    @EnableAutoConfiguration
    class EmbeddedKafkaTestConfiguration {
    }

}

我的kafkaTestProperties.properties文件如下:

embedded-kafka-brokers=${spring.embedded.kafka.brokers}
...

embedded-kafka-brokers最终将ProducerConfig通过一些底层自动配置提供给 Kafka。

有趣的是,embeddedKafkaBrokers测试类中的实例字段确实包含嵌入式 kafka 设置的代理 IP。

我已经得出结论,属性源加载顺序存在问题,@EmbeddedKafka没有及时设置代理 IP 系统属性kafkaTestProperties.properties以解决它。这个问题是在将我们的代码库移植到 Spring Boot 2 和 Spring Cloud Finchley SR2 后出现的,其中 Spring Kafka API 已经升级。

我试过删除@SpringBootTest和包装test()代码SpringApplicationBuilder无济于事。

关于如何解决这个问题的任何建议?也许我可以利用@AutoConfigurationAfter@Order?有没有办法命令加载属性源?

标签: springspring-bootjunitapache-kafkaembedded-kafka

解决方案


看起来您的占位符无效。尝试替换:

embedded-kafka-brokers=${"spring.embedded.kafka.brokers"}

和:

embedded-kafka-brokers=${spring.embedded.kafka.brokers}

并使用带有@ConfigurationProperties 的类或使用@Value("${embedded-kafka-brokers}") 将其提供给生产者。

文档链接


推荐阅读