Springboot整合Kafka之ContainerFactory
ContainerFactory
Kafka 消费者可以使用不同的消息监听器容器,例如ConcurrentKafkaListenerContainerFactory、KafkaMessageListenerContainer等。每个容器都提供了不同的功能和配置选项,可以根据实际需求进行选择和配置。 如果你需要自定义Kafka 消费者的配置选项,可以通过在Spring Boot配置文件中设置属性来实现。另外一种方法是通过创建KafkaListenerContainerFactory bean并配置其属性来实现。
如何创建一个ConcurrentKafkaListenerContainerFactory并使用
▼java复制代码@Configuration // 在springboot项目中可以去除,但在spring项目中文件中启用了Kafka功能就必须加上 @EnableKafka public class KafkaConfig { // 消费者config,此处为非springboot项目,所以需要单独构建 @Bean public Map<String, Object> consumerConfigs() { Map<String, Object> props = new HashMap<>(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put(ConsumerConfig.GROUP_ID_CONFIG, "my-group"); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); return props; } // 消费者工厂 @Bean public ConsumerFactory<String, String> consumerFactory() { return new DefaultKafkaConsumerFactory<>(consumerConfigs()); } @Bean public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>(); factory.setConsumerFactory(consumerFactory()); factory.setConcurrency(3); factory.getContainerProperties().setPollTimeout(3000); //也可以设置为批量消费,每个批次数量在Kafka配置参数中设置ConsumerConfig.MAX_POLL_RECORDS_CONFIG //factory.setBatchListener(true); return factory; } }
在上面的示例中,我们创建了一个 ConcurrentKafkaListenerContainerFactory 的 bean,并配置了一些属性,例如:
- 使用
DefaultKafkaConsumerFactory作为消费者工厂; - 设置并发消费者数量为
3; - 设置轮询超时时间为
3000 毫秒。
想要使用上述创建的Kafka消费者工厂,只需要为其指定containerFactory即可
▼java复制代码// Kafka开启事务的标识 @Transactional(rollbackFor = Exception.class) @GetMapping("/hello1") public String hello1() { // 发送消息 kafkaTemplate.send("topic3", "3"); return "hello1"; } // 使用containerFactory // 这里的congtainerFactory已经设置好了groupid,如果containerFactory中没有设置groupid这里记得设置 @KafkaListener(topics = "topic3",containerFactory = "kafkaListenerContainerFactory") public void processMessage(String message) { // 处理消息 log.info("hello1 >>>>> {}", message); }
我们可以通过containerFactory应用于不同的消费者方法和主题,以满足不同的需求。
创建多个消费者工厂
常见的使用场景如下:
▼java复制代码@Configuration public class KafkaConfig { // 场景1:需要回复的消息(Request-Reply) @Bean public ConcurrentKafkaListenerContainerFactory<String, String> replyFactory( ConsumerFactory<String, String> consumerFactory, @Lazy KafkaTemplate<String, String> kafkaTemplate) { var factory = new ConcurrentKafkaListenerContainerFactory<String, String>(); factory.setConsumerFactory(consumerFactory); // 如果要用到SendTo注解,就必须set这个属性 factory.setReplyTemplate(kafkaTemplate); // 设置回复模板 return factory; } // 场景2:需要手动提交偏移量 @Bean public ConcurrentKafkaListenerContainerFactory<String, String> manualFactory( ConsumerFactory<String, String> consumerFactory) { var factory = new ConcurrentKafkaListenerContainerFactory<String, String>(); factory.setConsumerFactory(consumerFactory); factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL); return factory; } // 场景3:需要并发消费 @Bean public ConcurrentKafkaListenerContainerFactory<String, String> concurrentFactory( ConsumerFactory<String, String> consumerFactory) { var factory = new ConcurrentKafkaListenerContainerFactory<String, String>(); factory.setConsumerFactory(consumerFactory); factory.setConcurrency(3); // 3个并发消费者 return factory; } // 4. repliesContainer 被 ReplyingKafkaTemplate 内部使用 // 用于接收 Request-Reply 模式中的回复消息 @Bean public ConcurrentMessageListenerContainer<String,String> repliesContainer( ConcurrentKafkaListenerContainerFactory<String, String> containerFactory) { ConcurrentMessageListenerContainer<String, String> replies = containerFactory.createContainer( "hello3_replies"); replies.getContainerProperties().setGroupId("hello3_replies_group"); replies.setAutoStartup(Boolean.FALSE); return replies; } }
优先级规则
▼text复制代码1. @KafkaListener 指定了 containerFactory 属性 ↓ 使用指定的 factory 2. 没有指定 containerFactory ↓ 查找名为 "kafkaListenerContainerFactory" 的 Bean 3. 没有自定义的 kafkaListenerContainerFactory ↓ 使用 Spring Boot 自动配置的默认 factory
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
作者分享
# 一本应届硕士,简历求指导
Boss直聘上实习和全职都有投递,但是只有几十个人的小厂有面试邀请。麻烦大家指点一下😢
1
Day 3
✅ 今天做了:在啃Kafka,LeetCode150题,面试题。课题相关文献。健身
⏰ 明天计划:照旧
📚 今日感悟:可惜时间不够多
1
SpringBoot中@kafkaListener()注解的学习
2
Day 1
✅ 今天做了:依旧面试题+leetcode150题,课题相关,kafka代码老是报错
⏰ 明天计划:照旧
📚 今日感悟:感觉时间不够花😅
1
Day 1
✅ 今天做了:面试鸭看了5道面试题,LeetCode刷了三道题。回顾了SpringBoot整合Kafka的相关流程。跑了跑模型
⏰ 明天计划:继续刷题节奏,学习kafka,把伙伴匹配系统完结掉
📚 今日感悟:对于数组问题,很多时候可以考虑双指针法。Java会在编译过程中将泛型擦除,以及PECS原则中的生产者和消费者身份和消息队列中的生产者与消费者身份是不一样的
1
