Scala 卡夫卡消费者阅读到它开始的时间,然后永远挂起

Scala 卡夫卡消费者阅读到它开始的时间,然后永远挂起,scala,apache-kafka,Scala,Apache Kafka,我已经建立了一个包含1个生产者和1个消费者的卡夫卡解决方案,并验证了所有连接都是正确的(我可以生成消息并使用它们)。ZK服务器和Kakfa服务器已启动且稳定 如前所述,我的问题是,消费者可以很好地从其停止的位置阅读消息,但只能阅读在开始阅读之前创建的消息。在此之后,直到我杀死消费者并重新启动他,新消息才会被读取 相关消费者Scala代码 val consumer = Consumer.create(new ConsumerConfig(readConsumerPropertiesFromCo

我已经建立了一个包含1个生产者和1个消费者的卡夫卡解决方案,并验证了所有连接都是正确的(我可以生成消息并使用它们)。ZK服务器和Kakfa服务器已启动且稳定

如前所述,我的问题是,消费者可以很好地从其停止的位置阅读消息,但只能阅读在开始阅读之前创建的消息。在此之后,直到我杀死消费者并重新启动他,新消息才会被读取

相关消费者Scala代码

  val consumer = Consumer.create(new ConsumerConfig(readConsumerPropertiesFromConfig))
  val filterSpec = new Whitelist("some-valid-topic")

  val stream: KafkaStream[String, String] =
    consumer.createMessageStreamsByFilter(filterSpec, 1, new StringDecoder, new StringDecoder).head

  log.info(s"Consumer started. Listening to topics [$filterSpec].")

  def read() = stream map digest
Where digest接收消息和元数据并从中获得乐趣

def digest(messageAndMeta: MessageAndMetadata[String, String]) = {
    log.info(s"processing the message [$messageAndMeta]")
属性是

properties.put("group.id", "default_consumer_group")
properties.put("zookeeper.connect", "localhost:2181")
properties.put("auto.offset.reset", "smallest")
properties.put("consumer.timeout.ms", 2000)
我可以用这个复制的时间轴

  • 产生5条信息
  • 启动消费者
  • 消费者阅读5条信息
  • 再发15条信息
  • 消费者会忽略新消息并永久挂起
  • 终止并重新启动消费程序
  • 消费者阅读了这15条消息,然后再次永久挂起

有什么想法吗?谢谢。

我怀疑您的问题是调用map以便从流中消费

试着通过stream.iterator.hasNext和stream.iterator.next直接使用迭代器,看看这是否有区别。这里有一个例子:


此外,如果2秒钟内没有可用数据,您将期望收到ConsumerTimeoutException,因此请确保您的代码已准备好处理该问题

问题是,我忽略了一个正在使我的消费者崩溃的ConsumerTimeoutException,我把它误认为是“消费者永远被绞死”

从有关消费者配置的文档中:

默认情况下,该值为-1,如果没有新消息可供使用,则使用者将无限期阻止

我把这个设置为秒数,然后它会抛出。通过将其设置为-1,我获得了所需的行为,尽管理想的解决方案(对于我的用例)是按照项目的思路实现一些东西:

希望它能帮助别人