Kafka Java Consumer不会从上次中断的地方获取消息

时间:2018-08-28 11:18:42

标签: scala apache-kafka kafka-consumer-api

我在应用程序中使用org.apache.kafka.clients.consumer.KafkaConsumer处理来自Kafka的消息。我在我的应用程序中注意到以下行为。如果我杀死我的应用程序,然后再次重新启动它,则当我再次启动该应用程序时,kafka使用者不会在此时间间隔内收到任何由kafka生产者发送的消息。这是我在应用程序中配置kafka使用者的方法

  val props = Map[String, Object](
  ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG -> EnvironmentConfig.getKafkaBootStrapServers,
  ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG -> classOf[StringDeserializer],
  ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG -> classOf[StringDeserializer],
  ConsumerConfig.AUTO_OFFSET_RESET_CONFIG -> "latest",
  ConsumerConfig.GROUP_ID_CONFIG -> "myGrouop",
  ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG -> (false: java.lang.Boolean))

// Create the consumer using props.
val consumer = new KafkaConsumer[String, String](props)

我的配置中缺少什么?请帮忙!

1 个答案:

答案 0 :(得分:1)

重新启动使用者后,它将尝试从上次提交的偏移量重新启动。如果未找到,默认情况下将从末尾重新启动。

我看到您已禁用自动提交(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG -> (false: java.lang.Boolean)))。在这种情况下,您是否手动提交偏移量?

如果不是,则说明您的使用者为何从头开始重新启动。它以前没有提交任何偏移量,因此默认为latest

首先,我建议您保持启用自动提交功能。一旦弄清楚了它是如何工作的,然后可以根据需要手动查看偏移量。