卡夫卡使用者中的SeekToCurrentErrorHandler无限重试

时间:2019-09-09 18:09:27

标签: spring-boot apache-kafka kafka-consumer-api spring-kafka

我已经使用spring-kafka在Spring启动应用程序中用SeekToCurrentErrorHandler配置了一个kafka使用者。我的使用者配置是:

     @Bean
  public ConsumerFactory<String, String> consumerFactory() {
    Map<String, Object> props = new HashMap<>();
    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafkaserver");
    props.put(ConsumerConfig.GROUP_ID_CONFIG, "group-id");

    props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ErrorHandlingDeserializer2.class);
    props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, ErrorHandlingDeserializer2.class);
    props.put(ErrorHandlingDeserializer2.KEY_DESERIALIZER_CLASS, StringDeserializer.class);
    props.put(ErrorHandlingDeserializer2.VALUE_DESERIALIZER_CLASS, StringDeserializer.class.getName());
    props.put(JsonDeserializer.KEY_DEFAULT_TYPE, "java.lang.String");
    props.put(JsonDeserializer.VALUE_DEFAULT_TYPE, "java.lang.String");

    return new DefaultKafkaConsumerFactory<>(props);
  }


@Bean
  public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
    SeekToCurrentErrorHandler seekToCurrentErrorHandler = new SeekToCurrentErrorHandler(5);
    seekToCurrentErrorHandler.setCommitRecovered(true);

    ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConsumerFactory(consumerFactory());
    factory.getContainerProperties().setAckOnError(false);
    factory.getContainerProperties().setAckMode(AckMode.MANUAL_IMMEDIATE);
    factory.setErrorHandler(seekToCurrentErrorHandler);

    return factory;
  }

为了测试SeekToCurrentErrorHandler配置,我以不正确的格式在kafka中推送了一条记录,因此该记录因反序列化异常而失败。根据我的理解,错误处理程序应尝试处理失败的记录5次,之后应登录并继续下一条记录。 但是它会无限次读取失败的记录。

请告诉我我要去哪里错了。

1 个答案:

答案 0 :(得分:0)

我正好拥有same problem,唯一要做的就是确保并发级别与主题的分区数相同。否则它将无限重试。

听起来像春天卡夫卡的虫子。