simpleConsumer模块是否有任何解决方法只读取新消息?

时间:2013-07-23 20:10:04

标签: apache-kafka

正如在这里提到的简单消费者

https://cwiki.apache.org/confluence/display/KAFKA/0.8.0+SimpleConsumer+Example

  

另请注意,我们明确检查是否正在读取偏移量   不小于我们要求的抵消额。这是必要的,因为如果   Kafka正在压缩消息,获取请求将返回一个   整个压缩块,即使请求的偏移量不是   压缩块的开头。这是我们之前看到的一条信息   可能会再次返回。

最后,我们会跟踪读取的消息数量。如果我们在最后一次请求中没有读到任何内容,我们就会睡觉一秒钟,所以当没有数据时我们不会敲打卡夫卡。

在我的程序中,它首先读取其中一条旧消息,然后在旧时进入睡眠状态,然后读取新记录。

任何解决方法,以便SimpleConsumer只读取新消息?

1 个答案:

答案 0 :(得分:0)

来自同一页

    public static long getLastOffset(SimpleConsumer consumer, String topic, int partition,
                                 long whichTime, String clientName) {
    TopicAndPartition topicAndPartition = new TopicAndPartition(topic, partition);
    Map<TopicAndPartition, PartitionOffsetRequestInfo> requestInfo = new HashMap<TopicAndPartition, PartitionOffsetRequestInfo>();
    requestInfo.put(topicAndPartition, new PartitionOffsetRequestInfo(whichTime, 1));
    kafka.javaapi.OffsetRequest request = new kafka.javaapi.OffsetRequest(requestInfo, kafka.api.OffsetRequest.CurrentVersion(),clientName);
    OffsetResponse response = consumer.getOffsetsBefore(request);

    if (response.hasError()) {
        System.out.println("Error fetching data Offset Data the Broker. Reason: " + response.errorCode(topic, partition) );
        return 0;
    }
    long[] offsets = response.offsets(topic, partition);
    return offsets[0];
}

它表示找到要读取的偏移量

  

Kafka包含两个常量来帮助,kafka.api.OffsetRequest.EarliestTime()在日志中找到数据的开头并从那里开始流式传输,kafka.api.OffsetRequest.LatestTime()只会传输新的消息。不要假设偏移量0是起始偏移量,因为消息会随着时间的推移而逐渐消失。