嵌入式Kafka Broker IP无法在属性文件中解析

时间:2019-03-06 14:18:33

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

我遇到的问题是我的Kafka ProducerConfig收到无效的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最终将通过一些基本的自动配置提供给Kafka的ProducerConfig

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

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

我尝试删除@SpringBootTest并将test()代码包装在SpringApplicationBuilder中无济于事。

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

1 个答案:

答案 0 :(得分:0)

您的占位符似乎无效。 尝试更换:

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

具有:

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

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

documentation link