@KafkaListener 批量数据List<ConsumerRecord<String, String>> records,出错重试策略
在使用 @KafkaListener 处理批量数据时,如果出现错误,你可能希望配置重试策略来处理这些错误。Spring Kafka 提供了多种方式来配置重试策略,包括使用 DefaultErrorHandler 和 RetryTemplate。以下是如何配置批量数据处理的重试策略的示例。
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:适用于批量消息的错误处理,可以自定义错误处理逻辑。

浙公网安备 33010602011771号