查看KafkaProperties源码:
找到Producer类:
public static class Producer {
private final KafkaProperties.Ssl ssl = new KafkaProperties.Ssl();
private String acks;
private DataSize batchSize;
private List<String> bootstrapServers;
private DataSize bufferMemory;
private String clientId;
private String compressionType;
private Class<?> keySerializer = StringSerializer.class;
private Class<?> valueSerializer = StringSerializer.class;
private Integer retries;
private String transactionIdPrefix;
private final Map<String, String> properties = new HashMap();
public Producer() {
}
。。。
可以发现除了上面这些属性,其他属性没有注入,所以yml中配置了也不生效,都是默认值;
解决办法:
新建配置类,添加要配置的属性,以生产者配置为例:
@Configuration
@EnableKafka
public class KafkaConfig {
@Value("${spring.kafka.bootstrap-servers}")
private String kafkaHost;
@Bean
public ProducerFactory<String, String> producerFactory() {
DefaultKafkaProducerFactory<String, String> producerFactory = new DefaultKafkaProducerFactory<>(producerConfigs());
return producerFactory;
}
@Bean
public Map<String, Object> producerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaHost);
props.put(ProducerConfig.RETRIES_CONFIG, 0);
props.put(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG, 5000);
props.put(ProducerConfig.LINGER_MS_CONFIG, 10);
props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, IntegerSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.MAX_BLOCK_MS_CONFIG, 10000);
return props;
}
@Bean
public KafkaTemplate<String, String> kafkaTemplate(ProducerFactory<String, String> producerFactory) {
return new KafkaTemplate<>(producerFactory);
}
}
这样配置后就会生效,也就是好多同学疑惑的地方,为啥配置文件中配置了还要再配置一遍???