根据我到目前为止所读的内容,使用者应该正确地使用消息,但是我得到的唯一输出是“。”。
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秒打印一次,而是没有任何中断。