java Kafka批量消费和单个消费消息

1、批量消费消息

1.1 配置参数

fetch.min.bytes:拉取的最小字节数

fetch.max.bytes:拉取的最大字节数

max.partition.fetch.bytes:分区拉取的最大字节数

fetch.max.wait.ms:拉取操作的最大等待时间

max.poll.records:拉取操作最大获取的记录数量

以上参数决定了一次消费能消费多少条消息。

java 复制代码
    @Bean
    public KafkaListenerContainerFactory<?> kafkaBatchConsumerFactory() {
        return batchFactory(consumerConfig(KafkaConsumerGroupIdConstant.KAFKA_CONSUMER_BATCH_GROUP, KafkaConsumerResetOffsetEnum.EARLIEST.getType()));
    }

1.2 消费代码

java 复制代码
    @KafkaListener(groupId = KafkaConsumerGroupIdConstant.KAFKA_CONSUMER_BATCH_GROUP,
            topics = KafkaTopicConstant.KAFKA_TOPIC,
            containerFactory = "kafkaBatchConsumerFactory")
    public void batchConsume(List<ConsumerRecord<String, String>> records, Acknowledgment ack) {
        String topicName = KafkaTopicConstant.KAFKA_TOPIC;
        try {
            List<String> valueList = records.stream()
                    .map(ConsumerRecord::value).collect(Collectors.toList());
            for (String value : valueList) {
                log.info("批量消费topic:{}, value:{}", topicName, value);
            }
            ack.acknowledge();
        } catch (Exception e) {
            log.error("kafka消费{}:", topicName, e);
        }
    }

1.3 消费结果

2、单个消费消息

2.1 配置参数

java 复制代码
    @Bean
    public KafkaListenerContainerFactory<?> kafkaSingleConsumerFactory() {
        ConcurrentKafkaListenerContainerFactory<Integer, String> resultFactory = batchFactory(consumerConfig(KafkaConsumerGroupIdConstant.KAFKA_CONSUMER_SINGLE_GROUP, KafkaConsumerResetOffsetEnum.EARLIEST.getType()));
        resultFactory.setBatchListener(false);
        return resultFactory;
    }

2.2 消费代码

java 复制代码
    @KafkaListener(groupId = KafkaConsumerGroupIdConstant.KAFKA_CONSUMER_SINGLE_GROUP,
            topics = KafkaTopicConstant.KAFKA_TOPIC,
            containerFactory = "kafkaSingleConsumerFactory")
    public void singleConsume(ConsumerRecord<String, String> records, Acknowledgment ack) {
        String topicName = KafkaTopicConstant.KAFKA_TOPIC;
        try {
            log.info("单个消费 topic:{}, value:{}", topicName, records.value());
            ack.acknowledge();
        } catch (Exception e) {
            log.error("kafka消费{}:", topicName, e);
        }
    }

2.3 消费结果

注:

部分代码未能在博客内体现,请点击以下链接跳转至Gitee的xudongbase项目的kafka分支。

xudongbase: 主要是项目中可以用到的共通方法,现有easyexcel分支在持续更新中。欢迎大家Star和提交Issues。easyexcel分支:批量设置样式,批量添加批注,批量合并单元格,设置冻结行和列,设置行高列宽,隐藏行和列,绑定下拉框数据,设置水印,插入图片 - Gitee.comhttps://gitee.com/xudong_master/xudongbase/tree/kafka/

相关推荐
indexsunny21 小时前
互联网大厂Java面试实战:从Spring Boot到微服务架构的深度解析
java·spring boot·spring cloud·kafka·prometheus·security·microservices
若水不如远方1 天前
分布式一致性(六):拥抱可用性 —— 最终一致性与 Gossip 协议
分布式·后端·算法
睡醒的土豆1 天前
解决 Kafka 管理工具中文乱码问题
分布式·kafka
SuniaWang1 天前
《Spring AI + 大模型全栈实战》学习手册系列· 专题二:《Milvus 向量数据库:从零开始搭建 RAG 系统的核心组件》
java·人工智能·分布式·后端·spring·架构·typescript
Hui Baby1 天前
TIDB分布式数据库提交设想
数据库·分布式·tidb
⑩-1 天前
RabbitMQ 架构和工作原理?RabbitMQ 延迟队列如何实现?
java·分布式·架构·rabbitmq
国冶机电安装1 天前
分布式控制系统(DCS)安装:从方案设计到投运验收的完整指南
分布式
飞Link1 天前
告别 ROS 的臃肿:用 ZeroMQ 构建极速具身智能分布式大脑(附 Python 实战)
开发语言·分布式·python
殷紫川1 天前
击穿 Kafka 高可用核心:分区副本、ISR 机制与底层原理全链路拆解
架构·kafka
会算数的⑨1 天前
演进——从查日志到 AI 自治,企业监控体系的变迁
人工智能·分布式·后端·微服务·云原生