上一章描述springboot对于kafka事务的支持,本章主要叙说springboot对于consumer支持。
这里通过两种方式
第一种:由springboot框架来初始化基础bean,我们只需要在yml配置文件中编写配置即可。如下图所示(常规配置 具体所有配置可参考http://kafka.apache.org/documentation/ 的consumer):
springboot初始化bena源码 :
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(KafkaTemplate.class)
@EnableConfigurationProperties(KafkaProperties.class)
@Import({ KafkaAnnotationDrivenConfiguration.class, KafkaStreamsAnnotationDrivenConfiguration.class })
/**
*初始化consumer工厂类 创建Consumer
*/
public class KafkaAutoConfiguration {
。。。。
@Bean
@ConditionalOnMissingBean(ConsumerFactory.class)
public ConsumerFactory<?, ?> kafkaConsumerFactory() {
return new DefaultKafkaConsumerFactory<>(this.properties.buildConsumerProperties());
}
。。。。
}
/**
*注入并行监听容器
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(EnableKafka.class)
class KafkaAnnotationDrivenConfiguration {
。。。。
/**
*创建MessageListenerContainer 工厂类
*/
@Bean
@ConditionalOnMissingBean(name = "kafkaListenerContainerFactory")
ConcurrentKafkaListenerContainerFactory<?, ?> kafkaListenerContainerFactory(
ConcurrentKafkaListenerContainerFactoryConfigurer configurer,
ConsumerFactory<Object, Object> kafkaConsumerFactory) {
ConcurrentKafkaListenerContainerFactory<Object, Object> factory = new ConcurrentKafkaListenerContainerFactory<>();
configurer.configure(factory, kafkaConsumerFactory);
return factory;
}
@Configuration(proxyBeanMethods = false)
@EnableKafka
@ConditionalOnMissingBean(name = KafkaListenerConfigUtils.KAFKA_LISTENER_ANNOTATION_PROCESSOR_BEAN_NAME)
static class EnableKafkaConfiguration {
}
}
对于kafkaListenerContainerFactory 的用于创建MessageListenerContainer 消息监听容器类
MessageListenerContainer有两个实现类KafkaMessageListenerContainer,ConcurrentMessageListenerContainer
KafkaMessageListenerContainer:以单线程的方式消费topic中所有partition数据
ConcurrentMessageListenerContainer:以并行的方式消费topic中所有partition数据(开启多线程),每一个线程会对应一个partition所有建议对于ConcurrentMessageListenerContainer的并发数与topic的partition数保持一致
MessageListenerContainer的作用在于对于MessageListener的管理
MessageListener这个接口的作用又是什么呢?用于消费topic中的数据,并对offset进行管理(2.3以后默认是手动提交)
springboot 对于MessageListener又默认8中实现:
1:public interface MessageListener<K, V> {
void onMessage(ConsumerRecord<K, V> data);
}
2:public interface AcknowledgingMessageListener<K, V> {
void onMessage(ConsumerRecord<K, V> data, Acknowledgment acknowledgment);
}
3:public interface ConsumerAwareMessageListener<K, V> extends MessageListener<K, V> {
void onMessage(ConsumerRecord<K, V> data, Consumer<?, ?> consumer);
}
4:public interface AcknowledgingConsumerAwareMessageListener<K, V> extends MessageListener<K, V> {
void onMessage(ConsumerRecord<K, V> data, Acknowledgment acknowledgment, Consumer<?, ?> consumer);
}
5:public interface BatchMessageListener<K, V> {
void onMessage(List<ConsumerRecord<K, V>> data);
}
6:public interface BatchAcknowledgingMessageListener<K, V> {
void onMessage(List<ConsumerRecord<K, V>> data, Acknowledgment acknowledgment);
}
7:public interface BatchConsumerAwareMessageListener<K, V> extends BatchMessageListener<K, V> {
void onMessage(List<ConsumerRecord<K, V>> data, Consumer<?, ?> consumer);
}
8:public interface BatchAcknowledgingConsumerAwareMessageListener<K, V> extends BatchMessageListener<K, V> {
void onMessage(List<ConsumerRecord<K, V>> data, Acknowledgment acknowledgment, Consumer<?, ?> consumer);
}
注:
- offset提交方式为自动提交,使用此接口可以处理从Kafka consumer poll操作接收的单个ConsumerRecord实例。
- offset提交方式为手动提交,使用此接口可以处理从Kafka consumer poll操作接收的单个ConsumerRecord实例。
- offset提交方式为自动提交,使用此接口可以处理从Kafka consumer poll操作接收的单个ConsumerRecord实例,并提供对提供对Consumer对象的访问。
- offset提交方式为手动提交,使用此接口可以处理从Kafka consumer poll操作接收的单个ConsumerRecord实例,并提供对提供对Consum