我正面临着一个问题,我的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
最终将通过一些底层的自动配置提供给卡夫卡的ProducerConfig
。
有趣的是,测试类中的embeddedKafkaBrokers
实例字段包含由嵌入式kafka设置的代理IP。
我得出的结论是,属性源加载顺序存在问题,@EmbeddedKafka
没有及时设置代理IP系统属性,以便kafkaTestProperties.properties
解决该问题。在将我们的代码库移植到Spring Boot2和Spring Cloud Finchley SR2之后,这个问题就出现了,Spring Kafka API已经升级了。
我尝试删除@SpringBootTest
并将test()
代码包装在SpringApplicationBuilder
中,但都无济于事。
对于如何解决这个问题,有什么建议吗?也许我可以利用@AutoConfigurationAfter
或@Order
?是否有一种方法可以对属性源的加载进行排序?
发布于 2019-03-06 14:54:14
您的占位符似乎无效。尝试替换:
embedded-kafka-brokers=${"spring.embedded.kafka.brokers"}
通过以下方式:
embedded-kafka-brokers=${spring.embedded.kafka.brokers}
并使用带有@ConfigurationProperties的类或使用@Value("${embedded-kafka-brokers}")将其提供给生产者。
https://stackoverflow.com/questions/55025247
复制