【发布时间】:2019-03-06 23:17:51
【问题描述】:
我遇到了一个问题,我的 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?有没有办法订购属性源的加载?
【问题讨论】:
标签: spring spring-boot junit apache-kafka embedded-kafka