springboot集成kafka的相关配置及自定义

news2025/4/4 15:15:56

之前的文章末尾,简单的实现了springboot集成kafka,完成了简单的测试,今天我们来扩展一下相关内容。

首先详解一下配置文件的内容:

spring:
  kafka:
    # 指定 kafka 地址,我这里部署在的虚拟机,开发环境是Windows,kafkahost是虚拟机的地址, 若外网地址,注意修改为外网的IP( 集群部署需用逗号分隔)
    producer:
      bootstrap-servers: 124.223.205.125:9092
      # 发生错误后,消息重发的次数。
      retries: 3
      #当有多个消息需要被发送到同一个分区时,生产者会把它们放在同一个批次里。该参数指定了一个批次可以使用的内存大小,按照字节数计算。
      batch-size: 16384
      # 设置生产者内存缓冲区的大小。
      buffer-memory: 33554432
      # 指定消息key和消息体的序列化方式
      key-deserializer: org.apache.kafka.common.serialization.StringSerializer
      value-deserializer: org.apache.kafka.common.serialization.StringSerializer
      acks: all
      properties:
        # 自定义生产者拦截器
        interceptor.classes: com.volga.kafka.interceptor.ProducerPrefixInterceptor
    consumer:
      enable-auto-commit: false #手动提交
      bootstrap-servers: ${spring.kafka.producer.bootstrap-servers}
      # 指定 group_id
      group-id: group_id
      # Kafka中没有初始偏移或如果当前偏移在服务器上不再存在时,默认区最新 ,有三个选项 【latest, earliest, none】
      auto-offset-reset: earliest
      # 指定消息key和消息体的序列化方式
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      properties:
        # 自定义消费者拦截器
        interceptor.classes: com.volga.kafka.interceptor.ConsumerPrefixInterceptor
    # 默认主题
    topic: my-topic
    listener:
      # 在侦听器容器中运行的线程数。
      concurrency: 5
      #listner负责ack,每调用一次,就立即commit
      ack-mode: manual_immediate
      missing-topics-fatal: false
      type: batch

以上的producer和consumer的相关配置也可以在java文件中实现:

如上图的实现,自己可以手动实现一下。

kafka内部自己实现分区、策略等一系列的逻辑,当然这些也可以自定义,这里有需要的可以自己研究一下,我这里就不需要了。

接下来,我介绍一个场景,是大家在实际的项目中可以用到。有这样一个场景,在项目中,我们搭建了kafka集群,然而在环境中,会有各种不同的消息,有一些消息不是我们需要的,有些消息是我们需要的,这时我们可以通过过滤器来进行控制和过滤。

在生产者端,我添加一个过滤器在消息前统一加上一个前缀。

 

@Slf4j
public class ProducerPrefixInterceptor implements ProducerInterceptor<String,String> {

    AtomicInteger success = new AtomicInteger(0);
    AtomicInteger fail = new AtomicInteger(0);

    @Override
    public ProducerRecord<String, String> onSend(ProducerRecord<String, String> producerRecord) {
        // 消息统一添加前缀
        String modifyValue = "prefix-"+producerRecord.value();
        return new ProducerRecord<>(producerRecord.topic(), producerRecord.partition(), producerRecord.timestamp(), producerRecord.key(), modifyValue, producerRecord.headers());
    }

    @Override
    public void onAcknowledgement(RecordMetadata recordMetadata, Exception e) {
        if (Objects.nonNull(recordMetadata)){
            success.incrementAndGet();
        }else {
            fail.incrementAndGet();
        }
    }

    @Override
    public void close() {
        log.info("success:%d\nfail:%d\n",success.get(),fail.get());
        success.set(0);
        fail.set(0);
    }

    @Override
    public void configure(Map<String, ?> map) {

    }
}

然后在消费者消费时,我遇到prefix前缀的消息时,就统一过滤掉,这不是我所需要的消息。

@Slf4j
public class ConsumerPrefixInterceptor implements ConsumerInterceptor<String,String> {

    /**
     * 过滤掉test开头的数据
     * @param consumerRecords
     * @return
     */
    @Override
    public ConsumerRecords<String, String> onConsume(ConsumerRecords<String, String> consumerRecords) {
        List<ConsumerRecord<String, String>> filterRecords = new ArrayList<>();
        Map<TopicPartition, List<ConsumerRecord<String, String>>> newRecords= new HashMap<>();
        Set<TopicPartition> partitions = consumerRecords.partitions();
        for(TopicPartition tp : partitions){
            List<ConsumerRecord<String, String>> records = consumerRecords.records(tp);
            for(ConsumerRecord<String, String> record: records){
                if(!record.value().startsWith("prefix")) {
                    filterRecords.add(record);
                }
            }
            if(filterRecords.size() > 0){
                newRecords.put(tp, filterRecords);
            }
        }
        return new ConsumerRecords<>(newRecords);
    }

    @Override
    public void onCommit(Map<TopicPartition, OffsetAndMetadata> map) {
        map.forEach((k,v) -> log.info("tp:%s--offset:%s\n",k,v));
    }

    @Override
    public void close() {

    }

    @Override
    public void configure(Map<String, ?> map) {

    }
}

相关的配置在上述的配置文件中也已经列出了,也可以在代码中加以配置。

props.put("properties.interceptor.classes","com.volga.kafka.interceptor.ProducerPrefixInterceptor");

这样就能实现过滤不需要的消息了。

翻看源码中,生产端主要是KafkaProducer<k,v>这个类中KafkaProducer方法:

消费端这边是对应的:KafkaConsumer<k,v>,这个类中KafkaConsumer方法:

源码里kafka实现的配置逻辑大家可以仔细研究一下。

我是空谷有来人,谢谢支持! 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/468584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编译原理陈火旺第三版第七章课后题答案

下面的答案仅供参考&#xff01; 1. 给出下面表达式的逆波兰表示&#xff08;后缀式&#xff09;&#xff1a; a*(-bc) not A or not (C or not D) ab*(cd/e) (A and B) or (not C or D) -ab*(-cd) …

python+nodejs+php+springboot+vue 青少年大学生心理健康科普系统

本文先提出了开发青少年心理健康科普平台的背景意义&#xff0c;然后通过功能性和非功能性分析阐述本系统的需求&#xff0c;然后从功能设计和数据库设计两方面进行系统的设计建模。在技术实现部分采用了 作为开发后台的编程语言&#xff0c;客户端使用微信小程序技术&#xff…

html5地理位置信息介绍, 百度地图使用

文章目录 1. HTML5中地理信息API1.1 Geolocation 接口 2. 在vue中使用百度地图3. 在react中使用百度地图 1. HTML5中地理信息API HTML5 的地理位置 API 可以让你获取用户的地理位置信息&#xff0c;并将其用于许多不同的应用场景&#xff0c;例如&#xff1a; 在地图上显示用…

Linux NAT软路由的简介、入门与配置

本文目录 1、确认Linux kernel内核版本2、netfilter的nat table简介3、用iptables实现SNAT3.1、 多对多(N:N)的SNAT3.2、 将一个网段内的某个公网IP移除出SNAT可用的公有IP地址池3.3、 设置目标地址为特定IP地址或者网段的报文不做NAT3.4、通过端口号&#xff0c;设置允许或者禁…

官宣!2023ACP世界大赛晋级赛名单公布!

2023 Adobe Certified Professional 世界大赛中国赛区报名已于4月1日截止。本届大赛吸引了 27 个省份&#xff0c;68个城市和地区的院校和培训机构&#xff0c;共计收到了 10705 为参赛选手报送各个类别的 11258 件参赛作品。 经过评审的层层选拔&#xff0c;共有200优秀作品脱…

Maven ( 一 ) 导入依赖

1.基本概念 1.1.什么是Maven Maven项目对象模型(Project Object Model)&#xff0c;可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的项目管理工具软件。 Maven提供了开发人员构建一个项目完整的生命周期框架。 开发团队可以自动完成项目的基础工具建设&am…

win11家庭版开机密码忘记了怎么办?

今天遇到一个用户win11家庭版本开机密码忘记了&#xff0c;所以要想办法进行跳过。 开始通过winpe进行管理员密码修改&#xff0c;但登录后出现管理员密码已经封掉不能登录&#xff0c;后来才知道win11家庭版已经去掉管理员账号。 而且登录的时候要输入pin&#xff0c;这个应…

数据标注,优化模型辅助标注、Label 库管理|ModelWhale 版本更新

春夏之交&#xff0c;草木际天。ModelWhale 新一轮的版本更新&#xff0c;期待为你带来更好的使用体验。 本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a; • 优化 模型辅助数据标注&#xff08;专业版✓ 团队版✓ &#xff09; • 新增 数据标注 Labe…

【LeetCode刷题记录】数组专题

说明&#xff1a; 文章内容为个人的力扣刷题记录&#xff0c;不定时更新。文章内容如有错误&#xff0c;欢迎指正。 文章目录 2023-04-24 题目1. 两数之和方法一&#xff1a;暴力解法&#xff0c;循环遍历方法二&#xff1a;哈希表 2023-04-25 4. 寻找两个正序数组的中位数方法…

在线CRM客户管理系统有好用的吗?这5款千万别错过!

阅读本文你将了解&#xff1a;1、CRM管理系统是什么&#xff1b;2.CRM管理系统在线用有哪些&#xff1b;3.CRM管理系统实际应用场景。 一、CRM管理系统是什么 CRM是客户关系管理的缩写&#xff0c;是指企业通过建立客户档案、跟进客户需求、提供优质服务来维系客户关系的一种管…

蓝牙聊天App设计1:Android Studio制作蓝牙聊天通讯软件(UI界面设计)

前言&#xff1a;蓝牙聊天App设计全部有三篇文章&#xff08;一、UI界面设计&#xff0c;二、蓝牙搜索配对连接实现&#xff0c;三、蓝牙连接聊天&#xff09;&#xff0c;这篇文章是一、UI界面设计 课程1&#xff1a;Android Studio小白安装教程&#xff0c;以及第一个Androi…

5.2 构造数值积分公式的基本方法与有关概念的例题分析

书上例题&#xff1a; 例3 确定求积公式 中的系数&#xff0c;使其具有尽可能高的代数精度。 我的答案&#xff1a; 一、信息 1.给了我一个求积公式 2.确定求积公式中的系数 3.使得这个求积系数具有尽可能高的代数精度。 二、分析 条件1&#xff1a;告诉我这个求积公…

Linux搭建我的世界服务器和如何使用公网远程进行联机教程

文章目录 前言1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 转载自内…

shell脚本----条件判断语句

文章目录 一、条件测试1.1 文件测试和整数测试文件测试整数值比较 1.2字符串测试和逻辑测试字符串测试&#xff1a;逻辑测试 二、if语句三、case语句 一、条件测试 1.1 文件测试和整数测试 文件测试 test命令 测试表达是是否成立&#xff0c;若成立则返回0&#xff0c;否则返…

手把手教你JAVA如何连接MYSQL-mysql-connector-j-8.0.32.jar

第一步&#xff1a;下载mysql驱动包 1、mysql官网&#xff1a;https://dev.mysql.com/downloads/connector/j/ 下载Connector/J &#xff08;JAVA使用&#xff09;如下图所示&#xff1a; 2、此时会进入下载页面&#xff0c;无需登录&#xff0c;直接下载即可&#xff0c;如下…

让Python自动测试更得心应手——认识一下神奇的pytest测试框架

目录&#xff1a;导读 前言 安装pytest pytest测试用例设计原则 pytest执行用例规则 1、执行某个目录下所有的用例 2、单独执行某个py文件 3、执行某个py文件里的某个函数 4、-s 参数 Pycharm运行Pytest 结语 前言 Python在测试圈的应用非常广泛&#xff0c;特别是…

人工智能中(Pytorch)框架下模型训练效果的提升方法

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能中(Pytorch)框架下模型训练效果的提升方法。随着深度学习技术的快速发展&#xff0c;越来越多的应用场景需要建立复杂的、高精度的深度学习模型。为了实现这些目标&#xff0c;必须采用一系列复杂的技术来提…

Zynq-7000、FMQL45T900的GPIO控制(四)---linux应用层配置GPIO输入控制

上文中详细阐述了对应原理图MIO/EMIO的编号&#xff0c;怎么计算获取linux下gpio的编号 本文涉及C代码上传&#xff0c;下载地址 Zynq-7000、FMQL45T900的GPIO控制c语言代码资源-CSDN文库 本文详细记录一下针对获取到gpio的编号&#xff0c;进行配置输入模式&#xff0c;并进…

Jenkins + Gitlab 实现项目自动化构建及部署

通俗来讲就是本地项目 push 到 gitlab 后, Jenkins 能够识别到项目的更新并自动构建部署;  本文以实际操作的方式来表述详细配置过程及避开配置 Jenkins 时的坑. 默认电脑已经安装了虚拟机, 默认gitlab 上已经有了你想要部署的项目, 部署了 maven 和 jdk 并配置了环境变量!!! …

H5拉新充场app系统源码

拉新充场是一种基于移动互联网技术的营销手段&#xff0c;通常由企业或商家使用推广软件来实现。拉新是指通过各种方式引导潜在用户注册成为企业的会员或客户&#xff0c;充场则是指通过向已有用户提供优惠券、折扣等福利来鼓励其进行消费或充值。 这种营销手段可以帮助企业…