配置消费者工厂
@Bean
public ConsumerFactory<String, String> consumerFactory() {
List<String> brokerList = kafkaConfigProperties.getBrokerList();
if (CollectionUtils.isEmpty(brokerList)) {
log.info("kafka主机配置为空!");
throw new IllegalArgumentException("kafka--broker 为空!");
}
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, StringUtils.join(kafkaConfigProperties.getBrokerList(), ","));
hashMap.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
hashMap.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
hashMap.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, Optional.ofNullable(kafkaConfigProperties.getMaxPollRecords()).orElse(500));
return new DefaultKafkaConsumerFactory<>(hashMap);
}
配置监听工厂
@Bean
public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory(ConsumerFactory<String, String> consumerFactory) {
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory);
factory.setConcurrency(Optional.ofNullable(kafkaConfigProperties.getPartitionNum()).orElse(1));
factory.setBatchListener(true);
factory.getContainerProperties().setPollTimeout(3000);
return factory;
}
构建监听工厂
public static KafkaMessageListenerContainer<String, String> buildKafkaListenerContainerFactory(KafkaConsumerInfoDto consumerInfo) {
ConsumerFactory<String, String> consumerFactory = SpringUtil.getBean("consumerFactory", ConsumerFactory.class);
ContainerProperties containerProperties = new ContainerProperties(consumerInfo.getTopic());
containerProperties.setGroupId(consumerInfo.getGroup());
containerProperties.setMessageListener(new KafkaBatchMessageListener(consumerInfo.getTopic()));
return new KafkaMessageListenerContainer<>(consumerFactory, containerProperties);
}
配置消费者管理
@Component
@Slf4j
public class KafkaConsumerManager {
private static final Map<String, KafkaMessageListenerContainer<String, String>> KAFKA_CONSUMER_THREAD_MAP = new HashMap<>();
public synchronized void addConsumer(KafkaConsumerInfoDto consumerInfo) {
if (ObjectUtils.isEmpty(consumerInfo)) {
return;
}
stopByConsumerId(consumerInfo.getConsumerId());
String consumerId = consumerInfo.getConsumerId();
KafkaMessageListenerContainer<String, String> kafkaMessageListener = KafkaUtil.buildKafkaListenerContainerFactory(consumerInfo);
KAFKA_CONSUMER_THREAD_MAP.put(consumerId, kafkaMessageListener);
kafkaMessageListener.start();
log.info("创建消费者: {} 成功!", consumerId);
}
public void stopByConsumerId(String consumerId) {
if (StringUtils.isEmpty(consumerId)) {
return;
}
KafkaMessageListenerContainer<String, String> kafkaMessageListenerContainer = KAFKA_CONSUMER_THREAD_MAP.get(consumerId);
if (ObjectUtils.isEmpty(kafkaMessageListenerContainer)) {
return;
}
kafkaMessageListenerContainer.stop();
KAFKA_CONSUMER_THREAD_MAP.remove(consumerId);
log.info("停止消费者: {} 成功!", consumerId);
}
}
消费者监听程序
@Slf4j
public class KafkaBatchMessageListener implements BatchConsumerAwareMessageListener<String, String> {
private String topic;
public KafkaBatchMessageListener() { }
public KafkaBatchMessageListener(String topic) {
this.topic = topic;
}
@Override
public void onMessage(List<ConsumerRecord<String, String>> list, Consumer<?, ?> consumer) {
KafkaMessageService kafkaMessageService = SpringUtil.getBean(KafkaMessageService.class);
List<String> messageList = list.stream().map(ConsumerRecord::value).collect(Collectors.toList());
kafkaMessageService.saveToFile(messageList, topic);
log.info("消费数量:{} 条..", list.size());
}
}
提交执行监听程序
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/119ba799f278a146a6b790e408236e41.png)
执行异步线程
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/14aa38891702c764906717d96250d310.png)
消费者记录拉取
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e23d83bc91b33c50ceafdd9b0b31a0d5.png)
回调 onMessage
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/59e36d7df3803d4da3381a51c74634b2.png)