@KafkaListener 批量数据List<ConsumerRecord<String, String>> records,出错重试策略

在使用 @KafkaListener 处理批量数据时,如果出现错误,你可能希望配置重试策略来处理这些错误。Spring Kafka 提供了多种方式来配置重试策略,包括使用 DefaultErrorHandlerRetryTemplate。以下是如何配置批量数据处理的重试策略的示例。

1. 配置 DefaultErrorHandler

DefaultErrorHandler 是 Spring Kafka 提供的一个默认错误处理器,可以用来处理单条消息和批量消息的错误。你可以配置它来实现重试策略。

示例配置

java
深色版本
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.context.annotation.Bean;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.listener.DefaultErrorHandler;
import org.springframework.kafka.support.ExponentialBackOffWithMaxRetries;
import org.springframework.retry.RetryPolicy;
import org.springframework.retry.backoff.FixedBackOffPolicy;
import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.retry.support.RetryTemplate;

import java.util.List;

public class KafkaConfig {

    @Bean
    public DefaultErrorHandler defaultErrorHandler() {
        // 创建一个重试模板
        RetryTemplate retryTemplate = new RetryTemplate();
        
        // 设置重试策略
        FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
        backOffPolicy.setBackOffPeriod(1000L); // 每次重试间隔1秒
        retryTemplate.setBackOffPolicy(backOffPolicy);

        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
        retryPolicy.setMaxAttempts(3); // 最大重试次数为3次
        retryTemplate.setRetryPolicy(retryPolicy);

        // 创建默认错误处理器
        DefaultErrorHandler errorHandler = new DefaultErrorHandler((record, ex) -> {
            // 自定义错误处理逻辑
            System.out.println("Failed to process record: " + record);
            ex.printStackTrace();
        }, retryTemplate);

        return errorHandler;
    }
}

使用 @KafkaListener

java
深色版本
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class KafkaConsumerService {

    @KafkaListener(topics = "batch-topic", groupId = "group-id", errorHandler = "defaultErrorHandler")
    public void listenBatchMessages(List<ConsumerRecord<String, String>> records) {
        for (ConsumerRecord<String, String> record : records) {
            System.out.println("Received message: " + record.value());
            // 模拟处理失败
            if (record.value().equals("error")) {
                throw new RuntimeException("Processing failed for record: " + record.value());
            }
        }
    }
}

2. 配置 BatchKafkaListenerErrorHandler

如果你需要更细粒度的控制,可以使用 BatchKafkaListenerErrorHandler 来处理批量消息的错误。

示例配置

java
深色版本
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.context.annotation.Bean;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.listener.BatchKafkaListenerErrorHandler;
import org.springframework.kafka.support.KafkaHeaders;
import org.springframework.messaging.MessageHeaders;

import java.util.List;

public class KafkaConfig {

    @Bean
    public BatchKafkaListenerErrorHandler batchKafkaListenerErrorHandler() {
        return (thrownException, message) -> {
            // 自定义错误处理逻辑
            System.out.println("Failed to process batch of messages: " + message);
            thrownException.printStackTrace();
            return null; // 返回null表示不重新抛出异常
        };
    }
}

使用 @KafkaListener

java
深色版本
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class KafkaConsumerService {

    @KafkaListener(topics = "batch-topic", groupId = "group-id", errorHandler = "batchKafkaListenerErrorHandler")
    public void listenBatchMessages(List<ConsumerRecord<String, String>> records) {
        for (ConsumerRecord<String, String> record : records) {
            System.out.println("Received message: " + record.value());
            // 模拟处理失败
            if (record.value().equals("error")) {
                throw new RuntimeException("Processing failed for record: " + record.value());
            }
        }
    }
}

总结

  • DefaultErrorHandler:适用于单条消息和批量消息的错误处理,可以配置重试策略。
  • BatchKafkaListenerErrorHandler:适用于批量消息的错误处理,可以自定义错误处理逻辑。
posted @ 2024-11-25 15:25  星云惊蛰  阅读(101)  评论(0)    收藏  举报