目前Kafka并没有提供直接的工具来帮助我们获取某个topic的当前总消息数,需要我们自行写程序来实现。下列代码可以实现这一功能,特此记录一下:
1/** 2 * 获取某个topic的当前消息数 3 * Java 8+ only 4 * 5 * @param topic 6 * @param brokerList 7 * @return 8 */ 9 public static long totalMessageCount(String topic, String brokerList) { 10 Properties props = new Properties(); 11 props.put("bootstrap.servers", brokerList); 12 props.put("group.id", "test-group"); 13 props.put("enable.auto.commit", "false"); 14 props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); 15 props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); 16 17 try (KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props)) { 18 List<TopicPartition> tps = Optional.ofNullable(consumer.partitionsFor(topic)) 19 .orElse(Collections.emptyList()) 20 .stream() 21 .map(info -> new TopicPartition(info.topic(), info.partition())) 22 .collect(Collectors.toList()); 23 Map<TopicPartition, Long> beginOffsets = consumer.beginningOffsets(tps); 24 Map<TopicPartition, Long> endOffsets = consumer.endOffsets(tps); 25 26 return tps.stream().mapToLong(tp -> endOffsets.get(tp) - beginOffsets.get(tp)).sum(); 27 } 28 }