查看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);
}
}
這樣配置後就會生效,也就是好多同學疑惑的地方,爲啥配置文件中配置了還要再配置一遍???