前言
在上一篇博文中,我们介绍了message listener是如何创建的。接下来,我们将继续探讨Consumer创建、消息拉取和消息传递给listener。
一、消费者创建
ListenerConsumer
KafkaMessageListenerContainer内部类,该内部类负责创建Kafka消费者、消息处理、将消息回传给对应的Method进行处理。
ListenerConsumer(GenericMessageListener<?> listener, ListenerType listenerType) {
// ……省略一些校验
// 使用配置DefaultKafkaConsumerFactory所传递的消费者配置信息,创建消费者。
this.consumer =
KafkaMessageListenerContainer.this.consumerFactory.createConsumer(
this.consumerGroupId,
this.containerProperties.getClientId(),
KafkaMessageListenerContainer.this.clientIdSuffix,
this.containerProperties.getConsumerProperties());
// 确定是否基于事务方式,进行消息消费。
if (this.transactionManager != null) {
this.transactionTemplate = new TransactionTemplate(this.transactionManager);
}
else {
this.transactionTemplate = null;
}
// 根据KafkaListener注解中配置的topic监听方式,确定topic消费类型。
subscribeOrAssignTopics(this.consumer);
GenericErrorHandler<?> errHandler = KafkaMessageListenerContainer.this.getGenericErrorHandler();
this.genericListener = listener;
// 根据listener类型,设置对应消息处理的Listener。
if (listener instanceof BatchMessageListener) {
this.listener = null;
this.batchListener = (BatchMessageListener<K, V>) listener;
this.isBatchListener = true;
this.wantsFullRecords = this.batchListener.wantsPollResult();
}
else if (listener instanceof MessageListener) {
this.listener = (MessageListener<K, V>) listener;
this.batchListener = null;
this.isBatchListener = false;
this.wantsFullRecords = false;
}
else {
throw new IllegalArgumentException("Listener must be one of 'MessageListener', "
+ "'BatchMessageListener', or the variants that are consumer aware and/or "
+ "Acknowledging"
+ " not " + listener.getClass().getName());
}
this.listenerType = listenerType;
this.isConsumerAwareListener = listenerType.equals(ListenerType.ACKNOWLEDGING_CONSUMER_AWARE)
|| listenerType.equals(ListenerType.CONSUMER_AWARE);
// 检查errorHandler数据类型
if (this.isBatchListener) {
validateErrorHandler(true);
this.errorHandler = new LoggingErrorHandler();
this.batchErrorHandler = determineBatchErrorHandler(errHandler);
}
else {
validateErrorHandler(false)