springboot kafka 消息重置过期时间

该博客介绍了如何在Kafka消费者处理消息耗时较长可能导致消息过期的情况下,通过反射调用内部方法`resetMaxPollIntervalMs`来重置消息的过期时间,确保消费流程的正常进行。示例代码展示了在消费者监听到消息后执行业务操作,并在操作耗时后调用重置方法的场景。
摘要由CSDN通过智能技术生成

当kafka消费者消息处理流程耗时时,时间不可控,需要重置过期时间

import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.internals.ConsumerCoordinator;
import org.apache.kafka.common.utils.Time;

import java.lang.reflect.Field;

/**
 * @author liaozesong
 */
@Slf4j
public class KafkaUtil {
    public static void resetMaxPollIntervalMs(Consumer<?, ?> consumer) {
        resetMaxPollIntervalMs(consumer, 300000);

    }

    public static void resetMaxPollIntervalMs(Consumer<?, ?> consumer, long ts) {
        try {
            Field field = consumer.getClass().getDeclaredField("coordinator");
            field.setAccessible(true);
            Object object = field.get(consumer);
            if (object != null) {
                ConsumerCoordinator coordinator = (ConsumerCoordinator) object;
                coordinator.poll(Time.SYSTEM.timer(ts));
            }
            log.info("重设消息过期时间:{}S", ts / 1000);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("重置消息过期时间异常");
        }

    }
}

消费者

import cn.hutool.core.lang.Assert;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.support.Acknowledgment;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 一批次解析完成
 *
 * @author liaozesong
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class ParserComputeConsumer {
    /**
     * 接受硬盘文件上传成功通知
     */
    @KafkaListener(topics = "${ai.topic.parse-finish}")
    public void listen(ConsumerRecord<String, String> record, Acknowledgment ack, Consumer<?, ?> consumer) {
        long offset = record.offset();
        String json = record.value();
        String topic = record.topic();
        try {
            log.info("listen msg:offset:{},topic:{},json:{}", offset, topic, json);
            for (AiResponsePo po : pos) {
                //耗时业务操作
                KafkaUtil.resetMaxPollIntervalMs(consumer);
            }
        } catch (Exception e) {
            log.warn(e.toString(), e);
            log.warn("listen msg:offset:{},topic:{},json:{}", offset, topic, json);
        } finally {
            ack.acknowledge();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值