1818
1919import java .io .IOException ;
2020import java .time .Duration ;
21+ import java .util .List ;
22+ import java .util .Map ;
23+
24+ import org .apache .kafka .clients .CommonClientConfigs ;
25+ import org .apache .kafka .clients .consumer .ConsumerConfig ;
26+ import org .apache .kafka .clients .producer .ProducerConfig ;
2127
2228import org .springframework .beans .factory .ObjectProvider ;
2329import org .springframework .boot .autoconfigure .AutoConfiguration ;
2632import org .springframework .boot .autoconfigure .condition .ConditionalOnMissingBean ;
2733import org .springframework .boot .autoconfigure .condition .ConditionalOnProperty ;
2834import org .springframework .boot .autoconfigure .condition .ConditionalOnSingleCandidate ;
35+ import org .springframework .boot .autoconfigure .kafka .KafkaConnectionDetails .Node ;
2936import org .springframework .boot .autoconfigure .kafka .KafkaProperties .Jaas ;
3037import org .springframework .boot .autoconfigure .kafka .KafkaProperties .Retry .Topic ;
3138import org .springframework .boot .context .properties .EnableConfigurationProperties ;
5663 * @author Eddú Meléndez
5764 * @author Nakul Mishra
5865 * @author Tomaz Fernandes
66+ * @author Moritz Halbritter
67+ * @author Andy Wilkinson
68+ * @author Phillip Webb
5969 * @since 1.5.0
6070 */
6171@ AutoConfiguration
@@ -66,8 +76,12 @@ public class KafkaAutoConfiguration {
6676
6777 private final KafkaProperties properties ;
6878
69- public KafkaAutoConfiguration (KafkaProperties properties ) {
79+ private final KafkaConnectionDetails connectionDetails ;
80+
81+ KafkaAutoConfiguration (KafkaProperties properties , ObjectProvider <KafkaConnectionDetails > connectionDetails ) {
7082 this .properties = properties ;
83+ this .connectionDetails = connectionDetails
84+ .getIfAvailable (() -> new PropertiesKafkaConnectionDetails (properties ));
7185 }
7286
7387 @ Bean
@@ -94,8 +108,9 @@ public LoggingProducerListener<Object, Object> kafkaProducerListener() {
94108 @ ConditionalOnMissingBean (ConsumerFactory .class )
95109 public DefaultKafkaConsumerFactory <?, ?> kafkaConsumerFactory (
96110 ObjectProvider <DefaultKafkaConsumerFactoryCustomizer > customizers ) {
97- DefaultKafkaConsumerFactory <Object , Object > factory = new DefaultKafkaConsumerFactory <>(
98- this .properties .buildConsumerProperties ());
111+ Map <String , Object > properties = this .properties .buildConsumerProperties ();
112+ applyKafkaConnectionDetailsForConsumer (properties );
113+ DefaultKafkaConsumerFactory <Object , Object > factory = new DefaultKafkaConsumerFactory <>(properties );
99114 customizers .orderedStream ().forEach ((customizer ) -> customizer .customize (factory ));
100115 return factory ;
101116 }
@@ -104,8 +119,9 @@ public LoggingProducerListener<Object, Object> kafkaProducerListener() {
104119 @ ConditionalOnMissingBean (ProducerFactory .class )
105120 public DefaultKafkaProducerFactory <?, ?> kafkaProducerFactory (
106121 ObjectProvider <DefaultKafkaProducerFactoryCustomizer > customizers ) {
107- DefaultKafkaProducerFactory <?, ?> factory = new DefaultKafkaProducerFactory <>(
108- this .properties .buildProducerProperties ());
122+ Map <String , Object > properties = this .properties .buildProducerProperties ();
123+ applyKafkaConnectionDetailsForProducer (properties );
124+ DefaultKafkaProducerFactory <?, ?> factory = new DefaultKafkaProducerFactory <>(properties );
109125 String transactionIdPrefix = this .properties .getProducer ().getTransactionIdPrefix ();
110126 if (transactionIdPrefix != null ) {
111127 factory .setTransactionIdPrefix (transactionIdPrefix );
@@ -140,7 +156,9 @@ public KafkaJaasLoginModuleInitializer kafkaJaasInitializer() throws IOException
140156 @ Bean
141157 @ ConditionalOnMissingBean
142158 public KafkaAdmin kafkaAdmin () {
143- KafkaAdmin kafkaAdmin = new KafkaAdmin (this .properties .buildAdminProperties ());
159+ Map <String , Object > properties = this .properties .buildAdminProperties ();
160+ applyKafkaConnectionDetailsForAdmin (properties );
161+ KafkaAdmin kafkaAdmin = new KafkaAdmin (properties );
144162 KafkaProperties .Admin admin = this .properties .getAdmin ();
145163 if (admin .getCloseTimeout () != null ) {
146164 kafkaAdmin .setCloseTimeout ((int ) admin .getCloseTimeout ().getSeconds ());
@@ -168,6 +186,34 @@ public RetryTopicConfiguration kafkaRetryTopicConfiguration(KafkaTemplate<?, ?>
168186 return builder .create (kafkaTemplate );
169187 }
170188
189+ private void applyKafkaConnectionDetailsForConsumer (Map <String , Object > properties ) {
190+ properties .put (ConsumerConfig .BOOTSTRAP_SERVERS_CONFIG ,
191+ nodesToStringList (this .connectionDetails .getConsumerBootstrapNodes ()));
192+ if (!(this .connectionDetails instanceof PropertiesKafkaConnectionDetails )) {
193+ properties .put (CommonClientConfigs .SECURITY_PROTOCOL_CONFIG , "PLAINTEXT" );
194+ }
195+ }
196+
197+ private void applyKafkaConnectionDetailsForProducer (Map <String , Object > properties ) {
198+ properties .put (ProducerConfig .BOOTSTRAP_SERVERS_CONFIG ,
199+ nodesToStringList (this .connectionDetails .getProducerBootstrapNodes ()));
200+ if (!(this .connectionDetails instanceof PropertiesKafkaConnectionDetails )) {
201+ properties .put (CommonClientConfigs .SECURITY_PROTOCOL_CONFIG , "PLAINTEXT" );
202+ }
203+ }
204+
205+ private void applyKafkaConnectionDetailsForAdmin (Map <String , Object > properties ) {
206+ properties .put (CommonClientConfigs .BOOTSTRAP_SERVERS_CONFIG ,
207+ nodesToStringList (this .connectionDetails .getAdminBootstrapNodes ()));
208+ if (!(this .connectionDetails instanceof PropertiesKafkaConnectionDetails )) {
209+ properties .put (CommonClientConfigs .SECURITY_PROTOCOL_CONFIG , "PLAINTEXT" );
210+ }
211+ }
212+
213+ private List <String > nodesToStringList (List <Node > nodes ) {
214+ return nodes .stream ().map ((node ) -> node .host () + ":" + node .port ()).toList ();
215+ }
216+
171217 private static void setBackOffPolicy (RetryTopicConfigurationBuilder builder , Topic retryTopic ) {
172218 long delay = (retryTopic .getDelay () != null ) ? retryTopic .getDelay ().toMillis () : 0 ;
173219 if (delay > 0 ) {
0 commit comments