我使用自动配置(仅通过注释)运行spring boot和kafka,并在.yaml文件中定义了道具,即:
spring:
kafka:
bootstrap-servers: someserver:9999
consumer:
group-id: mygroup
....
@KafkaListener()
public void receive(ConsumerRecord<?, ?> consumerRecord) {
....
}
它可以正常工作,弹簧映射,即字段group-id正确。
但是当我尝试使用相同的yaml文件手动配置kafka(与ConsumerFactory和ConsumerConfig一起使用)时,我遇到了问题。 在类ConsumerConfig中,kafka属性以命名。而不是_即:
public static final String GROUP_ID_CONFIG = "group.id";
所以我不能只将它们加载到map中并将该map传递给ConsumerFactory,因为键带有_ not。
我不想像春季kafka团队所提供的示例那样丑陋,当他们将yaml中的道具映射到config类,然后在地图中手动分配要传递给工厂的道具时:
@ConfigurationProperties(prefix = "kafka")
public class ConfigProperties {
private String brokerAddress;
private String topic;
private String fooTopic;
public String getBrokerAddress() {
return this.brokerAddress;
}
.....
@Bean
public ProducerFactory<String, String> producerFactory() {
Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, this.configProperties.getBrokerAddress());
.....
return new DefaultKafkaProducerFactory<>(props);
}
答案 0 :(得分:0)
如果要使用yml文件中的点分属性,则需要像boot那样对不直接作为启动属性支持的任意属性进行启动:
spring:
kafka:
consumer:
properties:
group.id: foo
即填充Properties
属性。
引导为某些属性提供一流支持的原因是,IDE编辑器可以提供内容辅助,而任意属性则无法实现。