我已经设置了一个带有1个生产者和1个消费者的Kafka解决方案,并验证所有连接都是正确的(我可以生成消息并使用它们)。 ZK服务器& Kakfa Server已启动且稳定。
如上所述,我的问题是,消费者会很好地阅读消息并从中断消息,但只会读取在开始阅读之前创建的消息。之后,在我杀死消费者并重新启动他之前,不会读取新消息。
相关消费者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
digest采用MessageAndMetadata并享受其乐趣
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)
我可以用这个
重现的时间表有什么想法?感谢。
答案 0 :(得分:2)
问题是我忽略了一个正在崩溃我的消费者的ConsumerTimeoutException,我把这误认为是消费者永远挂掉"。
来自消费者配置的文档:
默认情况下,此值为-1,如果没有新消息可供使用,则消费者将无限期地阻止。
我将此设置为几秒钟,之后它会抛出。通过将此值设置为-1,我得到了所需的行为,尽管理想的解决方案(对于我的用例)将实现此项目的某些内容:https://github.com/kciesielski/reactive-kafka
This thread pointed me in the right direction
希望它可以帮助别人。
答案 1 :(得分:1)
我怀疑你的问题是调用map以便从流中使用。
尝试直接通过stream.iterator.hasNext和stream.iterator.next使用迭代器,看看是否有所作为。这里有一个例子: https://cwiki.apache.org/confluence/display/KAFKA/Consumer+Group+Example
此外,如果2秒内没有数据可用,您将收到ConsumerTimeoutException,因此请确保您的代码已准备好处理它。