Kafka消费者对反序列化失败的行为

时间:2018-11-27 15:03:08

标签: java spring apache-kafka spring-integration

我想知道当对象反序列化失败时如何告诉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消息。

1 个答案:

答案 0 :(得分:1)

请参见2.2中引入的ErrorHandlingDeserializer

即将发布的2.2.1版本(将于明天发布)用类型安全的ErrorHandlingDeserializer2代替。

在两种情况下,反序列化异常都会传递到侦听器容器,该容器又将其直接传递给ErrorHandler而不是调用侦听器。