当前位置: 首页 > article >正文

SpringBoot集成kafka-监听器手动确认接收消息(主要为了保证业务完成后再确认接收)

SpringBoot集成kafka-监听器手动确认接收消息

  • 1、说明
  • 2、示例
    • 2.1、application.yml
    • 2.2、消费者
    • 2.3、生产者
    • 2.4、测试类
    • 2.5、测试

1、说明

kafak中默认情况下是自动确认消息接收的,也就是说先启动消费者监听程序,再启动生产者发送消息,此时消费者监听到生产者发送的消息后,程序会自动确认接收成功,偏移量会自动下移,此时再启动消费者,偏移量会从新的位置读取数据,如果本次出现异常,业务没有处理完成,那么下次启动消费者是读取不到本次的消息的,所以可以采用手动确认的配置,确保本次消费者接收到了消息,并且业务正常处理完毕了,给kafak手动反馈接收成功。

在这里插入图片描述

2、示例

在这里插入图片描述

2.1、application.yml

在这里插入图片描述

2.2、消费者

package com.power.consumer;

import com.power.model.User;
import com.power.util.JSONUtils;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.support.Acknowledgment;
import org.springframework.kafka.support.KafkaHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;

import java.util.function.Consumer;

@Component
public class EventConsumer {

    @KafkaListener(topics = {"${kafka.topic.name}"},groupId="${kafka.consumer.group}")
    public void onEvent4(String userJson,
                         @Header(value=KafkaHeaders.RECEIVED_TOPIC) String topic,
                         @Header(value=KafkaHeaders.RECEIVED_PARTITION_ID) String partition,
                         ConsumerRecord<String,String> record,
                         Acknowledgment ack){
        try {
            User user =JSONUtils.toBean(userJson,User.class);
            System.out.println("读取/消费到的事件,user:"+user+",topic:"+topic+",partition:"+partition);
            System.out.println("读取/消费到的事件:"+record.toString());

            int a = 10/0;

            //业务确认完成,给kafka服务器反馈确认
            ack.acknowledge();//手动确认消息,就是告诉kafka服务器,该消息我已经接收到了,默认情况下是自动确认
            //手动确认后,下次启动消费者,偏移量会从新的位置开始;没有手动确认,下次启动消费者,偏移量还是从老位置开始
        }catch (Exception e){
            e.printStackTrace();
        }

    }

}

2.3、生产者

package com.power.producer;

import com.power.model.User;
import com.power.util.JSONUtils;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;

@Component
public class EventProducer {

    @Resource
    private KafkaTemplate<String,Object> kafkaTemplate;

    public void sendEvent2(){
        User user = User.builder().id(10001).phone("15676767676").birthday(new Date()).build();
        String userJson = JSONUtils.toJSON(user);
        kafkaTemplate.send("helloTopic",userJson);
    }

}

2.4、测试类

package com.power;

import com.power.producer.EventProducer;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

@SpringBootTest
public class SpringBoot02KafkaBaseApplication {

    @Resource
    private EventProducer eventProducer;

    @Test
    void sendEvent2(){
        eventProducer.sendEvent2();
    }

}

2.5、测试

先启动消费者监听程序
再启动生产者发送消息
程序再业务中出现了异常:

在这里插入图片描述
再次启动消费者程序,因为再上次启动时出现了异常,也没有进行手动确认接收,所以本地启动消费者后依然可以读取到上次未完成业务时接收到的数据
在这里插入图片描述


http://www.kler.cn/a/281356.html

相关文章:

  • 探索异步之美:aiohttp库的魔力与奥秘
  • 守护核心命脉:国家网络安全战略下的关键基础设施保护
  • Pandas里使用SQL
  • 稚晖君智元机器人远程机器人系列发布:引领具身智能新高度
  • 软考:软件设计师 — 17.程序设计语言与语言处理程序基础
  • XSS LABS - Level 16 过关思路
  • 结构开发笔记(六):solidworks软件(五):绘制M2x3.0mm螺丝
  • MES系统如何灵活适配多种通信协议及数据采集能力
  • 单向链表和双向链表的一些基本算法
  • XR虚拟拍摄和VP有什么区别
  • git清除所有提交记录及贡献者信息
  • 硬盘数据如何恢复?别慌!5 大策略帮您恢复硬盘数据!
  • Redis缓存分区
  • SAP B1 常用表单的 中英文名称路径(持续更新中)
  • 【C#】【EXCEL】Bumblebee/Classes/ExData.cs
  • 【蓝桥杯省赛真题48】python最大矩形面积 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析
  • 无人机搭载高压喷水清洗绝缘子技术详解
  • 软件设计原则之依赖倒置原则
  • RabbitMQ如何保证消息不丢失(面试版)
  • Oracle(86)什么是索引重建(Index Rebuild)?