【kafka】手动拉取消息

需求描述

消费失败的消息,要重新拉取进行消费处理。

解决方法

import com.xxx.capitalplat.common.enums.ReturnCode;
import com.xxx.capitalplat.common.exception.KafkaException;
import com.xxx.capitalplat.modules.app.service.KafkaService;
import lombok.extern.slf4j.Slf4j;
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.TopicPartition;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.time.Duration;
import java.util.Collections;
import java.util.Iterator;
import java.util.Properties;

@Slf4j
@Service
public class KafkaServiceImpl implements KafkaService {

    private static final long DURATION_TIMEOUT = 5L;
    private static final int COUNT = 1;

    @Value("${spring.kafka.bootstrap-servers}")
    private String bootstrapServers;
    @Value("${spring.kafka.consumer.group-id}")
    private String groupId;
    @Value("${spring.kafka.consumer.auto-commit-interval}")
    private String autoCommitInterval;
    @Value("${spring.kafka.consumer.auto-offset-reset}")
    private String autoOffsetReset;


    @Override
    public ConsumerRecord<String, String> pull(String topic, int partition, int offset) {
        log.info("拉取kafka消息,topic:{},partition:{},offset:{}", topic, partition, offset);
        Properties props = new Properties();
        props.put("bootstrap.servers", bootstrapServers);
        props.put("group.id", groupId);
        props.put("enable.auto.commit", "true");
        props.put("auto.commit.interval.ms", autoCommitInterval);
        props.put("session.timeout.ms", "30000");
        props.put("auto.offset.reset", autoOffsetReset);
        props.put("key.deserializer", StringDeserializer.class.getName());
        props.put("value.deserializer", StringDeserializer.class.getName());
        log.info("拉取kafka消息配置:{}", props);

        try (KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props)) {
            TopicPartition topicPartition = new TopicPartition(topic, partition);
            consumer.assign(Collections.singletonList(topicPartition));
            consumer.seek(topicPartition, offset);
            ConsumerRecords<String, String> consumerRecords = consumer.poll(Duration.ofSeconds(DURATION_TIMEOUT));

            if (consumerRecords.count() == COUNT) {
                Iterator<ConsumerRecord<String, String>> iterator = consumerRecords.iterator();
                ConsumerRecord<String, String> consumerRecord = iterator.next();
                log.info("拉取kafka消息结果,topic:{},partition:{},offset:{},msg:{}", consumerRecord.topic(), consumerRecord.partition(), consumerRecord.offset(), consumerRecord.value());
                return consumerRecord;
            } else {
                throw new KafkaException(ReturnCode.DATA_STATUS_ERROR, "拉取kafka消息数量错误");
            }
        } catch (Exception e) {
            throw new KafkaException(ReturnCode.FAIL, "拉取kafka消息错误");
        }
    }


}

参考文章

https://www.cnblogs.com/umgsai/p/15592303.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于 Kafka 消费者拉取不到数据的问题,可以有几种可能的原因和解决方法。以下是一些常见的排查步骤: 1. 确认主题和分区:首先,确保您的消费者订阅了正确的主题和分区。您可以通过检查消费者的代码或配置文件来确认这一点。 2. 检查消费者组:如果您的消费者属于一个消费者组,确保消费者组中有足够的消费者来处理分区中的消息。如果消费者组中的消费者数少于分区数,部分分区可能无法被消费。 3. 检查消费者偏移量:Kafka 使用偏移量(offset)来跟踪消费者在分区中读取的位置。如果消费者的偏移量发生错误,可能会导致无法拉取到数据。您可以尝试重置消费者的偏移量,或者根据需要进行手动提交。 4. 检查消息生产者:确保消息生产者正常发送消息Kafka 集群,并且消息被正确地发布到相关主题和分区。 5. 检查网络连接:确保消费者能够与 Kafka 集群建立正常的网络连接。您可以尝试使用 Kafka 工具,如 kafka-console-consumer 或 kafka-console-producer 进行测试。 6. 检查消费者配置:检查消费者的相关配置,如 Kafka 集群的地址、端口、安全认证等,确保它们与实际情况一致。 7. 查看日志:查看消费者的日志文件,以了解任何错误或警告信息。日志文件通常位于消费者的工作目录中。 如果您能提供更多细节或错误信息,我可以给出更具体的指导。希望这些步骤对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值