Polish "Auto-configure Kafka MessageConverter"
Closes gh-10380
This commit is contained in:
parent
d7bc93f278
commit
2537a0a753
|
|
@ -20,7 +20,7 @@ import org.springframework.boot.autoconfigure.kafka.KafkaProperties.Listener;
|
|||
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
|
||||
import org.springframework.kafka.core.ConsumerFactory;
|
||||
import org.springframework.kafka.listener.config.ContainerProperties;
|
||||
import org.springframework.kafka.support.converter.MessageConverter;
|
||||
import org.springframework.kafka.support.converter.RecordMessageConverter;
|
||||
|
||||
/**
|
||||
* Configure {@link ConcurrentKafkaListenerContainerFactory} with sensible defaults.
|
||||
|
|
@ -33,7 +33,7 @@ public class ConcurrentKafkaListenerContainerFactoryConfigurer {
|
|||
|
||||
private KafkaProperties properties;
|
||||
|
||||
private MessageConverter messageConverter;
|
||||
private RecordMessageConverter messageConverter;
|
||||
|
||||
/**
|
||||
* Set the {@link KafkaProperties} to use.
|
||||
|
|
@ -44,10 +44,10 @@ public class ConcurrentKafkaListenerContainerFactoryConfigurer {
|
|||
}
|
||||
|
||||
/**
|
||||
* Set the {@link MessageConverter} to use.
|
||||
* Set the {@link RecordMessageConverter} to use.
|
||||
* @param messageConverter the message converter
|
||||
*/
|
||||
public void setMessageConverter(MessageConverter messageConverter) {
|
||||
void setMessageConverter(RecordMessageConverter messageConverter) {
|
||||
this.messageConverter = messageConverter;
|
||||
}
|
||||
|
||||
|
|
@ -61,10 +61,10 @@ public class ConcurrentKafkaListenerContainerFactoryConfigurer {
|
|||
public void configure(
|
||||
ConcurrentKafkaListenerContainerFactory<Object, Object> listenerContainerFactory,
|
||||
ConsumerFactory<Object, Object> consumerFactory) {
|
||||
listenerContainerFactory.setConsumerFactory(consumerFactory);
|
||||
if (this.messageConverter != null) {
|
||||
listenerContainerFactory.setMessageConverter(this.messageConverter);
|
||||
}
|
||||
listenerContainerFactory.setConsumerFactory(consumerFactory);
|
||||
Listener container = this.properties.getListener();
|
||||
ContainerProperties containerProperties = listenerContainerFactory
|
||||
.getContainerProperties();
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ import org.springframework.kafka.annotation.EnableKafka;
|
|||
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
|
||||
import org.springframework.kafka.config.KafkaListenerConfigUtils;
|
||||
import org.springframework.kafka.core.ConsumerFactory;
|
||||
import org.springframework.kafka.support.converter.MessageConverter;
|
||||
import org.springframework.kafka.support.converter.RecordMessageConverter;
|
||||
|
||||
/**
|
||||
* Configuration for Kafka annotation-driven support.
|
||||
|
|
@ -40,12 +40,12 @@ class KafkaAnnotationDrivenConfiguration {
|
|||
|
||||
private final KafkaProperties properties;
|
||||
|
||||
private final MessageConverter messageConverter;
|
||||
private final RecordMessageConverter messageConverter;
|
||||
|
||||
KafkaAnnotationDrivenConfiguration(KafkaProperties properties,
|
||||
ObjectProvider<MessageConverter> messageConverter) {
|
||||
ObjectProvider<RecordMessageConverter> messageConverter) {
|
||||
this.properties = properties;
|
||||
this.messageConverter = messageConverter.getIfAvailable();
|
||||
this.messageConverter = messageConverter.getIfUnique();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ public class KafkaAutoConfiguration {
|
|||
public KafkaAutoConfiguration(KafkaProperties properties,
|
||||
ObjectProvider<RecordMessageConverter> messageConverter) {
|
||||
this.properties = properties;
|
||||
this.messageConverter = messageConverter.getIfAvailable();
|
||||
this.messageConverter = messageConverter.getIfUnique();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@ import org.springframework.kafka.core.KafkaAdmin;
|
|||
import org.springframework.kafka.core.KafkaTemplate;
|
||||
import org.springframework.kafka.listener.AbstractMessageListenerContainer.AckMode;
|
||||
import org.springframework.kafka.security.jaas.KafkaJaasLoginModuleInitializer;
|
||||
import org.springframework.kafka.support.converter.MessageConverter;
|
||||
import org.springframework.kafka.support.converter.MessagingMessageConverter;
|
||||
import org.springframework.kafka.support.converter.RecordMessageConverter;
|
||||
import org.springframework.kafka.test.utils.KafkaTestUtils;
|
||||
|
|
@ -68,7 +67,8 @@ public class KafkaAutoConfigurationTests {
|
|||
|
||||
@Test
|
||||
public void consumerProperties() {
|
||||
this.contextRunner.withUserConfiguration(TestConfiguration.class)
|
||||
this.contextRunner
|
||||
.withUserConfiguration(TestConfiguration.class)
|
||||
.withPropertyValues(
|
||||
"spring.kafka.bootstrap-servers=foo:1234",
|
||||
"spring.kafka.properties.foo=bar",
|
||||
|
|
@ -90,8 +90,8 @@ public class KafkaAutoConfigurationTests {
|
|||
"spring.kafka.consumer.group-id=bar",
|
||||
"spring.kafka.consumer.heartbeat-interval=234",
|
||||
"spring.kafka.consumer.key-deserializer = org.apache.kafka.common.serialization.LongDeserializer",
|
||||
"spring.kafka.consumer.value-deserializer = org.apache.kafka.common.serialization.IntegerDeserializer")
|
||||
.run((context) -> {
|
||||
"spring.kafka.consumer.value-deserializer = org.apache.kafka.common.serialization.IntegerDeserializer"
|
||||
).run((context) -> {
|
||||
DefaultKafkaConsumerFactory<?, ?> consumerFactory = context
|
||||
.getBean(DefaultKafkaConsumerFactory.class);
|
||||
Map<String, Object> configs = consumerFactory.getConfigurationProperties();
|
||||
|
|
@ -133,7 +133,8 @@ public class KafkaAutoConfigurationTests {
|
|||
|
||||
@Test
|
||||
public void producerProperties() {
|
||||
this.contextRunner.withUserConfiguration(TestConfiguration.class)
|
||||
this.contextRunner
|
||||
.withUserConfiguration(TestConfiguration.class)
|
||||
.withPropertyValues(
|
||||
"spring.kafka.clientId=cid",
|
||||
"spring.kafka.properties.foo.bar.baz=qux.fiz.buz",
|
||||
|
|
@ -151,8 +152,8 @@ public class KafkaAutoConfigurationTests {
|
|||
"spring.kafka.producer.ssl.keystore-password=p5",
|
||||
"spring.kafka.producer.ssl.truststore-location=classpath:tsLocP",
|
||||
"spring.kafka.producer.ssl.truststore-password=p6",
|
||||
"spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.IntegerSerializer")
|
||||
.run((context) -> {
|
||||
"spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.IntegerSerializer"
|
||||
).run((context) -> {
|
||||
DefaultKafkaProducerFactory<?, ?> producerFactory = context
|
||||
.getBean(DefaultKafkaProducerFactory.class);
|
||||
Map<String, Object> configs = producerFactory.getConfigurationProperties();
|
||||
|
|
@ -232,8 +233,8 @@ public class KafkaAutoConfigurationTests {
|
|||
"spring.kafka.jaas.enabled=true",
|
||||
"spring.kafka.jaas.login-module=foo",
|
||||
"spring.kafka.jaas.control-flag=REQUISITE",
|
||||
"spring.kafka.jaas.options.useKeyTab=true")
|
||||
.run((context) -> {
|
||||
"spring.kafka.jaas.options.useKeyTab=true"
|
||||
).run((context) -> {
|
||||
DefaultKafkaProducerFactory<?, ?> producerFactory = context
|
||||
.getBean(DefaultKafkaProducerFactory.class);
|
||||
DefaultKafkaConsumerFactory<?, ?> consumerFactory = context
|
||||
|
|
@ -271,17 +272,17 @@ public class KafkaAutoConfigurationTests {
|
|||
|
||||
@Test
|
||||
public void testKafkaTemplateRecordMessageConverters() {
|
||||
this.contextRunner.withUserConfiguration(RecordMessageConvertersConfiguration.class)
|
||||
this.contextRunner.withUserConfiguration(MessageConverterConfiguration.class)
|
||||
.run((context) -> {
|
||||
KafkaTemplate kafkaTemplate = context.getBean(KafkaTemplate.class);
|
||||
assertThat(kafkaTemplate.getMessageConverter())
|
||||
.isSameAs(context.getBean("myRecordMessageConverter"));
|
||||
.isSameAs(context.getBean("myMessageConverter"));
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testConcurrentKafkaListenerContainerFactoryWithCustomMessageConverters() {
|
||||
this.contextRunner.withUserConfiguration(MessageConvertersConfiguration.class)
|
||||
this.contextRunner.withUserConfiguration(MessageConverterConfiguration.class)
|
||||
.run((context) -> {
|
||||
ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory = context
|
||||
.getBean(ConcurrentKafkaListenerContainerFactory.class);
|
||||
|
|
@ -298,23 +299,13 @@ public class KafkaAutoConfigurationTests {
|
|||
}
|
||||
|
||||
@Configuration
|
||||
protected static class RecordMessageConvertersConfiguration {
|
||||
protected static class MessageConverterConfiguration {
|
||||
|
||||
@Bean
|
||||
public RecordMessageConverter myRecordMessageConverter() {
|
||||
public RecordMessageConverter myMessageConverter() {
|
||||
return mock(RecordMessageConverter.class);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
protected static class MessageConvertersConfiguration {
|
||||
|
||||
@Bean
|
||||
public MessageConverter myMessageConverter() {
|
||||
return mock(MessageConverter.class);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4846,6 +4846,8 @@ public class MyBean {
|
|||
}
|
||||
----
|
||||
|
||||
NOTE: If a `RecordMessageConverter` bean is defined, it is associated automatically to the
|
||||
auto-configured `KafkaTemplate`.
|
||||
|
||||
|
||||
[[boot-features-kafka-receiving-a-message]]
|
||||
|
|
@ -4853,7 +4855,8 @@ public class MyBean {
|
|||
When the Apache Kafka infrastructure is present, any bean can be annotated with
|
||||
`@KafkaListener` to create a listener endpoint. If no `KafkaListenerContainerFactory`
|
||||
has been defined, a default one is configured automatically with keys defined in
|
||||
`spring.kafka.listener.*`.
|
||||
`spring.kafka.listener.*`. Also, if a `RecordMessageConverter` bean is defined, it is
|
||||
associated automatically to the default factory.
|
||||
|
||||
The following component creates a listener endpoint on the `someTopic` topic:
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue