Kafka高级消费者使用Java API从主题获取所有消息(相当于 - 从头开始​​)

时间:2014-02-13 18:20:55

标签: apache-kafka java-api consumer

我正在使用Kafka网站上的ConsumerGroupExample代码测试Kafka High Level Consumer。我想检索我在Kafka服务器配置中名为“test”的主题的所有现有消息。查看其他博客,auto.offset.reset应设置为“最小”,以便能够获取所有消息:

private static ConsumerConfig createConsumerConfig(String a_zookeeper, String a_groupId)    {
    Properties props = new Properties();
    props.put("zookeeper.connect", a_zookeeper);
    props.put("group.id", a_groupId);
    props.put("auto.offset.reset", "smallest");
    props.put("zookeeper.session.timeout.ms", "10000");     

    return new ConsumerConfig(props);
}

我真正的问题是:高级消费者的等效Java api调用相当于:

bin / kafka-console-consumer.sh --zookeeper localhost:2181 - topic test - from-beginning

4 个答案:

答案 0 :(得分:7)

基本上,每当新消费者尝试使用主题时,它都会从头开始阅读消息。如果您每次都是为了测试而从头开始消费,那么每次使用新的groupID初始化您的消费者时,它都会从头开始阅读消息。以下是我的表现方式:

properties.put("group.id", UUID.randomUUID().toString());

每次都从头开始阅读邮件!

答案 1 :(得分:5)

看起来您需要使用“低级SimpleConsumer API”

  

对于大多数应用程序,高级消费者Api足够好。   某些应用程序需要未向高级别消费者公开的功能   (例如,在重新启动消费者时设置初始偏移)。他们能   而是使用我们的低级SimpleConsumer Api。逻辑将是一点点   更复杂,您可以按照here中的示例进行操作。

此示例适用于从主题获取具有以下参数的所有消息:(请注意,端口是Kafka端口,而不是ZooKeeper端口,从this example设置的主题):

10 my-replicated-topic 0 localhost 9092

具体来说,有一种获取readOffset的方法,它采用kafka.api.OffsetRequest.EarliestTime():

long readOffset = getLastOffset(consumer,a_topic, a_partition, kafka.api.OffsetRequest.EarliestTime(), clientName);

以下是另一篇文章,可能会提供一些有关如何对其进行排序的其他想法:How to get data from old offset point in Kafka?

答案 2 :(得分:2)

要从头开始获取消息,您可以执行以下操作:

import kafka.utils.ZkUtils;
ZkUtils.maybeDeletePath("zkhost:zkport", "/consumers/group.id");

然后按照例行工作......

答案 3 :(得分:0)

 Properties props = new Properties(); 
 props.put("bootstrap.servers", "localhost:9092");
 props.put("auto.offset.reset", "earliest");
 props.put("group.id", UUID.randomUUID().toString());

此属性可以帮助您。