我想知道当对象反序列化失败时如何告诉kafka使用者 从kafka删除记录,记录错误并继续收听其他传入消息。
我的用户配置如下: 消费者属性:
Map<String, Object> consumerProperties = new HashMap<>();
consumerProperties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
kafkaPropertiesConfiguration.getBootstrapServers());
consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
StringDeserializer.class.getName());
consumerProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
NullDeserializer.class.getName());
consumerProperties.put(ConsumerConfig.CLIENT_ID_CONFIG,
kafkaTelecontrolEventConsumerProperties.getClientIdConfig());
consumerProperties.put(ConsumerConfig.GROUP_ID_CONFIG,
kafkaTelecontrolEventConsumerProperties.getGroupIdConfig());
return new DefaultKafkaConsumerFactory<>(consumerProperties);
NullDeserializer.class是我用于测试的反序列化器:
@Log4j2
public class NullDeserializer implements Deserializer<Object> {
@Override
public void configure(Map<String, ?> configs, boolean isKey) {
}
@Override
public Object deserialize(String topic, byte[] data) {
try {
TeleControl.Event.parseFrom(data) ;
} catch (InvalidProtocolBufferException e) {
throw new RuntimeException(e);
}
return null;
}
@Override
public void close() {
}
}
IntegrationFlow:
return IntegrationFlows
.from(Kafka
.messageDrivenChannelAdapter(telecontrolEventConsumerFactory,
eventConsumerProperties.getTelecontrolEventTopic())
)
.handle(System.err::println)
.get();
我的主要问题是当解析失败时引发新的RuntimeException时,如何告诉kafkaConsumer记录错误,删除记录并继续处理下一个kafka消息。
答案 0 :(得分:1)
请参见2.2中引入的ErrorHandlingDeserializer。
即将发布的2.2.1版本(将于明天发布)用类型安全的ErrorHandlingDeserializer2
代替。
在两种情况下,反序列化异常都会传递到侦听器容器,该容器又将其直接传递给ErrorHandler
而不是调用侦听器。