kafka学习(6)-Springboot整合kafka-消费者手动

在java代码中使用kafka(springboot整合kafka) java代码maven项目实现kafka的连接及生产者、消费者的创建,以及消息的发布和订阅 阅读详情

目录

 

1、场景

2、代码

2.1、生产者、消费者配置文件

2.2、生产者发送100条测试数据

2.3、消费者收取100条测试数据-自动

2.4、消费者收取100条测试数据-手动

2.4.1、手动提交注释不打开

2.4.2、手动提交注释打开


1、场景

上一篇kafka的consumer消费者,我们使用的是自动提交offset下标。 
但是offset下标自动提交其实在很多场景都不适用,因为自动提交是在kafka拉取到数据之后就直接提交,这样很容易丢失数据,尤其是在需要事物控制的时候。 
很多情况下我们需要从kafka成功拉取数据之后,对数据进行相应的处理之后再进行提交。如拉取数据之后进行写入mysql这种 , 所以这时我们就需要进行手动提交kafka的offset下标。

2、代码

2.1、生产者、消费者配置文件


import java.time.Duration;

public class MQDict {
	public static final String MQ_ADDRESS_COLLECTION = "192.168.10.10:9092";			//kafka地址
    public static final String CONSUMER_TOPIC = "topic-test";						//消费者连接的topic
    public static final String PRODUCER_TOPIC = "topic-test";						//生产者连接的topic
    public static final String CONSUMER_GROUP_ID = "group-test";								//groupId,可以分开配置
    public static final String CONSUMER_ENABLE_AUTO_COMMIT = "true";				//是否自动提交(消费者)
    public static final String CONSUMER_AUTO_COMMIT_INTERVAL_MS = "1000";			
    public static final String CONSUMER_SESSION_TIMEOUT_MS = "30000";				//连接超时时间
    public static final int CONSUMER_MAX_POLL_RECORDS = 10;							//每次拉取数
    public static final Duration CONSUMER_POLL_TIME_OUT = Duration.ofMillis(3000);	//拉去数据超时时间
}

2.2、生产者发送100条测试数据


import java.util.Properties;

import org.apache.kafka.clients.producer.Callback;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
import org.apache.kafka.common.serialization.StringSerializer;
import org.apache.log4j.Logger;

public class Producer {
	static Logger log = Logger.getLogger(Producer.class);

	private static KafkaProducer<String, String> producer = null;

	/*
	 * 初始化生产者
	 */
	static {
		Properties configs = initConfig();
		producer = new KafkaProducer<String, String>(configs);
	}

	/*
	 * 初始化配置
	 */
	private static Properties initConfig() {
		Properties props = new Properties();
		props.put("bootstrap.servers", MQDict.MQ_ADDRESS_COLLECTION);
		props.put("acks", "1");
		props.put("retries", 0);
		props.put("batch.size", 16384);
		props.put("key.serializer", StringSerializer.class.getName());
		props.put("value.serializer", StringSerializer.class.getName());
		return props;
	}

	/**
	 * 批量发送100条
	 */
	public static void sendMessages() {
		// 消息实体
		ProducerRecord<String, String> record = null;
		for (int i = 0; i < 100; i++) {
			record = new ProducerRecord<String, String>(MQDict.PRODUCER_TOPIC, "value" + i);
			// 发送消息
			producer.send(record, new Callback() {
				@Override
				public void onCompletion(RecordMetadata recordMetadata, Exception e) {
					if (null != e) {
						log.info("send error" + e.getMessage());
					} else {
						System.out.println(String.format("发送信息---offset:%s,partition:%s", recordMetadata.offset(),
								recordMetadata.partition()));
					}
				}
			});
		}
		producer.close();
	}

}

结果:

                                                

 

2.3、消费者收取100条测试数据-自动

 public static final String CONSUMER_ENABLE_AUTO_COMMIT = "true";       //是否自动提交(消费者)


import java.util.Arrays;
import java.util.Properties;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class Consumer {
	 static Logger log = Logger.getLogger(Consumer.class);

	    private static KafkaConsumer<String,String> consumer;

		/**
		*  初始化消费者
		*/
	    static {
	        Properties configs = initConfig();
	        consumer = new KafkaConsumer<String, String>(configs);
	        consumer.subscribe(Arrays.asList(MQDict.CONSUMER_TOPIC));
	    }
		/**
		*  初始化配置
		*/
	    private static Properties initConfig(){
	        Properties props = new Properties();
	        props.put("bootstrap.servers", MQDict.MQ_ADDRESS_COLLECTION);
	        props.put("group.id", MQDict.CONSUMER_GROUP_ID);
	        props.put("enable.auto.commit", MQDict.CONSUMER_ENABLE_AUTO_COMMIT);
	        props.put("auto.commit.interval.ms", MQDict.CONSUMER_AUTO_COMMIT_INTERVAL_MS);
	        props.put("session.timeout.ms", MQDict.CONSUMER_SESSION_TIMEOUT_MS);
	        props.put("max.poll.records", MQDict.CONSUMER_MAX_POLL_RECORDS);
	        props.put("auto.offset.reset", "earliest");
	        props.put("key.deserializer", StringDeserializer.class.getName());
	        props.put("value.deserializer", StringDeserializer.class.getName());
	        return props;
	    }
	    
	    public static void receivebatch() {
	        Logger.getLogger("org").setLevel(Level.ERROR);

	        while (true) {
	            ConsumerRecords<String, String> records = consumer.poll(MQDict.CONSUMER_POLL_TIME_OUT);
	            records.forEach((ConsumerRecord<String, String> record)->{
	                    log.info("收到消息: key ==="+record.key()+" value ===="+record.value()+" topic ==="+record.topic());
	            });
	        }
	    }
	 
}

 

 

2.4、消费者收取100条测试数据-手动

public static final String CONSUMER_ENABLE_AUTO_COMMIT = "false";       //是否自动提交(消费者)

2.4.1、手动提交注释不打开

	public static void receivebatch_shoudong() {
		Logger.getLogger("org").setLevel(Level.ERROR);

		while (true) {
			ConsumerRecords<String, String> records = consumer.poll(MQDict.CONSUMER_POLL_TIME_OUT);
			records.forEach((ConsumerRecord<String, String> record) -> {
				log.info("收到消息: key ===" + record.key() + " value ====" + record.value() + " topic ==="
						+ record.topic());
			});
		}
		// consumer.commitSync(); 提交
	}

执行结果:

               

可见提交的100条全部取出,当再次启动consumer时,执行结果:

               

因为没有提交消费,已经被消费的数据还会被再次消费。

 

2.4.2、手动提交注释打开

public static void receivebatch_shoudong_50() {
		 Logger.getLogger("org").setLevel(Level.ERROR);

	        int i = 1 ;
	        while (true) {
	            ConsumerRecords<String, String> records = consumer.poll(MQDict.CONSUMER_POLL_TIME_OUT);
	            records.forEach((ConsumerRecord<String, String> record)->{
	                    log.info("收到消息: key ==="+record.key()+" value ===="+record.value()+" topic ==="+record.topic());
	            });
	            i++;
	            //每次拉10条CONSUMER_MAX_POLL_RECORDS = 10;		
	            if (i > 5 ){
	                consumer.commitSync();
	                consumer.close();
	                break;
	            }
	        }
	}

执行结果:

               

再次执行:

              

Kafka应用点滴(一)——Springboot集成Kafka之手动提交offset Springboot集成kafka,在实验consumer手动提交offset时,发现设置spring.kafka.consumer.enable-auto-commit=false后,没有调用consumer.commitAsync()的情况下,offset仍然被提交,经查其实spring在负责“手动”提交,按官网说法,有以下几种提交模式: RECORD - commit t... 阅读详情

相关推荐

springboot整合kafka

本教程将介绍如何在 Spring Boot 应用程序中使用 Kafka。Kafka是一个分布式的发布-订阅消息系统,它可以处理大量数据并提供高吞吐量。在本教程中,我们将使用 Spring Boot 2.7.2 和Kafka 2.8.1。

m0_74642813的博客 5044

简单实用spring-cloud-starter-stream-kafka以及手动提交

spring-cloud-starter-stream-kafka

ai_haibin的博客 3842

SpringBoot整合kafka

本文介绍了在Spring Boot应用中集成Kafka的完整流程。首先需要在pom.xml中添加spring-kafka依赖,然后在application.yml中配置Kafka服务器地址、生产者/消费者的序列化方式等参数。接着通过KafkaProducerConfig类配置生产者工厂和KafkaTemplate模板。最后创建REST控制器,使用KafkaTemplate将接收到的消息发送到指定主题。整个过程涵盖了Kafka在Spring Boot中的基本配置和使用方法,包括生产者的创建和消息发送功能实现。

꯭ 瞎꯭扯꯭蛋꯭的博客 1373

Springboot 整合Kafka, 如何实现手动提交offset

前言 大名鼎鼎的消息中间件Kafka大家一定不陌生吧,使用消息中间件的时候最怕的就是消息丢失了,如何解决这个问题呢?或许大家都知道,消费者端手动提交offset嘛。那么具体代码该怎么写呢?本文就基于springboot来进行消费者手动提交offset的试验。 配置 application.yml spring: kafka: # 指定 kafka 地址可以多个 bootstrap-servers: - 192.168.130.128:9092 - 192.168.

weixin_42494845的博客 6239

springboot整合kafka消费者最佳实践

本文将深入介绍如何利用Spring Boot整合Kafka实现消费者,探讨其原理和实现步骤。通过详细的解释和示例代码,读者将学会如何使用Spring Boot轻松构建高效的Kafka消费者,实现实时数据处理。

todoitbo的博客 1万+

STM32F103跑LVGL,用DMA加速刷屏,800*480大屏也能丝滑

本文详细介绍了如何在STM32F103芯片上通过DMA加速和内存优化,实现800*480大屏的LVGL流畅运行。通过FSMC+DMA硬件架构优化、双缓冲机制和LVGL参数调优,显著提升了界面刷新率和响应速度,适用于嵌入式GUI开发中的高性能需求场景。

weixin_30357231的博客 375

Springboot整合Kafka-自动,手动提交偏移量

本篇记录一下消息的提交方式,默认的消费位移提交的方式是自动提交的,这个由消费者客户端参数enable.auto.commit控制,默认为true,默认的自动提交不是每消费一条消息就提交一次,而是定期的提交,这个定期的周期时间由客户端参数auto.commit.interval.ms配置,默认为5秒,此参数生效的前提是enable.auto.commit参数为true。自动提交消费位移的方式非常简便,它免去了复杂的位移提交逻辑,让编码更简洁。但随之而来的是重复消费和消息丢失的问题。那重复消费和消息丢失的问..

FAIRYTAIL的博客 1万+

告别F5失灵!手把手教你为Cursor配置.Net Core控制台项目专属调试环境

本文详细指导如何在Cursor编辑器中为.Net Core控制台项目配置专属调试环境,解决F5失灵等常见问题。从调试器选择到launch.json配置,再到高级调试技巧,帮助开发者高效搭建完整的调试工具链,提升开发效率。

weixin_28834765的博客 284

Springboot整合Kafka(自动,手动提交偏移量)

文章目录 一. 简介 二. 自动提交偏移量 三. 手动提交偏移量 3.1 引入依赖 3.2 Kafka配置 3.2.1 生产者 3.2.2 消费者 3.2.3 测试 源码地址 项目推荐 该篇博客实现Springboot整合kafka ,自动,手动提交偏移量 更多高级用法请看下篇博客 一. 简介 kafka概念相关的介绍请看官方文档和其他博文 官方中文文档 kafka入门介绍 我们可以把偏移量交给kafka去提交,也可以自己控制提交时机。例如消息处理过程缓慢的情况下,就需要自己控制偏移量何时提交比较好。

woaitingting1985的博客 5987

避开SM30维护视图的坑:自动更新字段+日志记录的5个关键配置步骤

本文深入解析了SAP ABAP开发中SM30维护视图的深度定制,聚焦于实现自动更新字段与日志记录功能。文章详细阐述了从SE54配置起点到核心编码的5个关键步骤,重点讲解了如何利用事件驱动模型(如05创建事件和01保存前事件)安全操作动态数据结构,并提供了避免常见陷阱的实用技巧,帮助开发者构建稳定可靠的自动化维护机制。

plant的博客 621

别再乱点U盘里的.exe了!手把手教你彻底清除那个伪装成Usb Disk的蠕虫病毒

本文详细介绍了如何识别、清除和预防伪装成Usb Disk的蠕虫病毒。从识别感染迹象到安全备份文件,再到深度清理病毒残留和构建防护策略,提供了一套完整的U盘病毒解决方案。特别提醒用户注意U盘病毒的风险,并养成良好的使用习惯。

weixin_30496999的博客 658

Springboot整合kafka

1. 整合kafka 1、引入依赖 <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> 2、设置yml文件 spring: application: name: demo

Hello World 3万+

具身智能与空天具身智能:从理论到实践的AIBOX技术革命

本文深入探讨了具身智能从理论到实践的发展,重点介绍了AIBOX技术如何作为边缘智能计算模块,为无人机、机器人等无人系统提供可进化的“大脑”。文章通过空天具身智能等应用场景,阐述了AIBOX在实现感知、决策、行动一体化闭环中的核心作用,并展望了其在协同智能与规模化部署中的未来挑战与机遇。

lll78的博客 765

springboot 整合 kafka 使用手动提交消费

kafka消费者配置文件 import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.common.serialization.StringDeserializer; import org.apache.kafka.common.serialization.StringSerializer; i

吃顿好的 4094

YOLO26改进105:全网首发--使用BiFPN改进特征金字塔网络

YOLOv6 v3.0在目标检测领域实现重大突破,通过改进网络架构和训练方案显著提升性能。该版本在COCO数据集上展现出优越表现:YOLOv6-N达到37.5% AP/1187 FPS,YOLOv6-S实现45.0% AP/484 FPS,均超越同类检测器。大模型YOLOv6-M/L分别达到50.0%/52.8% AP,L6版本更创下实时检测新纪录。关键技术包括RepVGGBlock、BiFusion等新型模块,通过多分支融合和高效重参数化设计提升性能。研究团队已验证各改进模块有效性,代码已开源。

AIcurator的博客 95

【图像超分】论文精读:RepSR: Training Efficient VGG-style Super-Resolution Networks with Structural Re-Paramete

摘要: 本文提出RepSR,一种基于结构重新参数化和批量归一化(BN)的高效VGG式超分辨率网络。针对SR任务中BN易引发伪影的问题,作者通过分析发现训练-测试阶段的不一致性是主因,并提出先使用小批量统计训练、后期切换为总体统计的优化策略。RepSR块设计包含干净的残差路径和带改进BN的扩展-压缩卷积路径,有效平衡了训练非线性与推理效率。实验表明,RepSR在不同模型规模下优于现有重参数化方法,且实际推理速度更快。该工作为SR提供了性能与效率兼优的解决方案,相关代码未开源。 关键词: 超分辨率、结构重参数化

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 301

SpringBoot整合Kafka (一)

Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景,比如基于hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。

2301_80092713的博客 1706

《基于FPGA的数字信号处理》专栏的导航与说明

《基于FPGA的数字信号处理》专栏的导航与说明

孤独的单刀 4158

SpringBoot整合Kafka (二)

Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景,比如基于hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。

2301_80092713的博客 1855

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

知识点16--spring boot整合kafka

本篇知识点沿用知识点15的项目,为大家介绍spring boot如何连接kafka,本章有些长请耐心看完。没有kafka集群的去我主页找–>第一步:首先导入pom依赖 第二步:修改spring boot配置文件 第三步:我们建立一个测试类,来认识如何使用生产者 我们在服务器端开一个消费者,消费test主题的消息,集群地址改你自己的 我们运行测试类,看效果 通过效果,我们可以看到数据成功发送第四步:我们要知道spring boot整合的kafka为我们提供了两种可供选择的生产方式,上一步是其一叫做异步发送,

别人笑我太疯癫,我笑他人看不穿。 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

spring boot整合kafka(springBoot默认自动配置和自定义手动配置)

spring boot自动配置方式整合 spring boot具有许多自动化配置,对于kafka的自动化配置当然也包含在内,基于spring boot自动配置方式整合kafka,需要做以下步骤。 1. 引入kafka的pom依赖包 <!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafk...

weixin_42669555的博客 2万+

【弄nèng - Kafka】应用篇(四) —— Springboot整合Kafka(自动,手动提交偏移量)

文章目录一. 简介二. 自动提交偏移量三. 手动提交偏移量3.1 引入依赖3.2 Kafka配置3.2.1 生产者3.2.2 消费者2.2.3 测试源码地址项目推荐 该篇博客实现Springboot整合kafka ,自动,手动提交偏移量 更多高级用法请看下篇博客 一. 简介 kafka概念相关的介绍请看官方文档和其他博文 官方中文文档 kafka入门介绍 二. 自动提交偏移量 自动提交偏移量就...

司马缸砸缸了 6024

【Java】SpringBoot快速整合Kafka

Kafka是一个开源的流式平台,用于构建实时数据流应用程序和实时数据管道。Kafka旨在处理大规模的数据流,具有高吞吐量、可扩展性、持久性和容错性的特点。

m0_64210833的博客 6567

springboot:整合Kafka

springboot:整合Kafka

拒绝熬夜啊的博客 5647

SpringBoot整合Kafka的快速使用教程

Kafka是一个高性能、分布式的消息发布-订阅系统,被广泛应用于大数据处理、实时日志分析等场景。Spring Boot作为目前最流行的Java开发框架之一,其简洁的配置和丰富的工具使得与Kafka的集成变得更加容易。本文将介绍如何使用Spring Boot整合Kafka,实现高效的数据处理和消息传递。

胜人者有力,自胜者强! 2589

什么是kafka,如何学习kafka,整合SpringBoot

什么是kafka,如何学习kafka,整合SpringBoot

杨荧的优快云博客 3178
上一篇: git-eclipse 提交忽略 ingnore
下一篇: kafka学习(7)-Springboot整合kafka-多线程
^果然好^
博客等级 码龄18年 406粉丝 325原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值