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

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

1、说明

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

2、示例

2.1、application.yml

2.2、消费者

java 复制代码
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、生产者

java 复制代码
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、测试类

java 复制代码
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、测试

先启动消费者监听程序

再启动生产者发送消息

程序再业务中出现了异常:

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

相关推荐
洛卡卡了3 分钟前
从被动救火到主动预警,接入 Prometheus + Grafana 全流程
后端·面试·架构
无限进步_9 分钟前
扫雷游戏的设计与实现:扫雷游戏3.0
c语言·开发语言·c++·后端·算法·游戏·游戏程序
追逐时光者21 分钟前
使用 Visual Studio 快速创建 NuGet 程序包并发布到 NuGet 官网
后端·.net·visual studio
ahauedu1 小时前
Spring Boot 2.7+ 中 RedisConnectionFactory Autowire 警告的深度解析
java·spring boot·后端
IT_陈寒2 小时前
React 性能优化:5个实战技巧让首屏加载提升50%,开发者亲测有效!
前端·人工智能·后端
大厂码农老A2 小时前
你打的日志,正在拖垮你的系统:从P4小白到P7专家都是怎么打日志的?
java·前端·后端
摇滚侠2 小时前
Spring Boot 3零基础教程,深度理解 Spring Boot 自动配置原理,笔记11
spring boot·笔记·后端
间彧3 小时前
Spring Boot默认支持Logback的原因分析
后端
ezl1fe3 小时前
第零篇:把 Agent 跑起来的最小闭环
人工智能·后端·agent