KafkaConsumer不使用消息

时间:2019-01-19 22:37:53

标签: java apache-kafka kafka-consumer-api kafka-producer-api

根据我到目前为止所读的内容,使用者应该正确地使用消息,但是我得到的唯一输出是“。”。

public class KafkaConsumerSample {

public static void main(String []args) {
    runProducer();
    //runConsumer();
}

static void runProducer() {
    Properties props = new Properties();
    props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
    props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName());
    props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

    Producer<Long, String> producer = new KafkaProducer<Long, String>(props);

     for (int i = 0; i < 10; i++) {
         producer.send(new ProducerRecord<Long, String>("foo", "test message" + Integer.toString(i)));
     }
     producer.close();
}

static void runConsumer() {
    Properties props = new Properties();
    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
    props.put(ConsumerConfig.GROUP_ID_CONFIG, "group-id");
    props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName());
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
    KafkaConsumer<Long, String> consumer = new KafkaConsumer<Long, String>(props); 
    consumer.subscribe(Arrays.asList("foo"));

    while(true) {
        ConsumerRecords<Long, String> records = consumer.poll(Duration.ofSeconds(10));
        System.out.println(".");
        for(ConsumerRecord<Long, String> record: records) {
            System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
        }
    }
}

}

Kafka日志告诉我以下内容:

  

groupp测试中的使用者Consumer-1失败,将其从   组

     

准备与21代老一代进行平衡测试

     

第22代的分组测试现在为空

我不太了解这意味着什么。我想念什么?在我看来,这非常简单。

更新

运行使用者时,我希望读取所有偏移量。从偏移量0到最新的偏移量。我试过了:

static void runConsumer() {
        Properties props = new Properties();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        props.put(ConsumerConfig.GROUP_ID_CONFIG, "group-id");
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName());
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, OffsetResetStrategy.EARLIEST.toString().toLowerCase());
        KafkaConsumer<Long, String> consumer = new KafkaConsumer<Long, String>(props); 
        consumer.subscribe(Arrays.asList("foo"));


        while(true) {
            consumer.seekToBeginning(consumer.assignment());
            ConsumerRecords<Long, String> records = consumer.poll(Duration.ofSeconds(5));

            System.out.println(".");
            for(ConsumerRecord<Long, String> record: records) {
                System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
            }
        }
    }

仅仅将AUTO_OFFSET_RESET_CONFIG设置为最早显然不够。我运行了使用者一次,它打印了从0到最新的所有偏移量,但是现在再次运行后不再打印了吗?不确定我是否正确理解此配置。这就是为什么我添加了consumer.seek()方法,但是又将其放置在什么地方呢?如果我如图所示将其放置在while(true)循环中,它将打印从偏移量0到最新值的所有内容,但不是每5秒打印一次,而是没有任何中断。

0 个答案:

没有答案