You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
3.7 KiB
82 lines
3.7 KiB
import org.apache.kafka.clients.consumer.ConsumerConfig;
|
|
import org.apache.kafka.clients.consumer.ConsumerRecord;
|
|
import org.apache.kafka.clients.consumer.ConsumerRecords;
|
|
import org.apache.kafka.clients.consumer.KafkaConsumer;
|
|
import org.apache.kafka.common.serialization.StringDeserializer;
|
|
|
|
import java.time.Duration;
|
|
import java.util.Collections;
|
|
import java.util.Properties;
|
|
|
|
public class JavaKafkaConsumer {
|
|
public static void main(String[] args) {
|
|
if (args.length < 2) {
|
|
System.err.println("Usage: java JavaKafkaConsumer <broker> <topic>");
|
|
System.exit(1);
|
|
}
|
|
|
|
String broker = args[0];
|
|
String topic = args[1];
|
|
|
|
System.out.println("Connecting to Kafka broker: " + broker);
|
|
System.out.println("Topic: " + topic);
|
|
|
|
Properties props = new Properties();
|
|
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, broker);
|
|
props.put(ConsumerConfig.GROUP_ID_CONFIG, "java-test-group");
|
|
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
|
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
|
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
|
|
props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "true");
|
|
props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, "10");
|
|
props.put(ConsumerConfig.FETCH_MIN_BYTES_CONFIG, "1");
|
|
props.put(ConsumerConfig.FETCH_MAX_WAIT_MS_CONFIG, "1000");
|
|
|
|
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
|
|
consumer.subscribe(Collections.singletonList(topic));
|
|
|
|
System.out.println("Starting to consume messages...");
|
|
|
|
int messageCount = 0;
|
|
int errorCount = 0;
|
|
long startTime = System.currentTimeMillis();
|
|
|
|
try {
|
|
while (true) {
|
|
try {
|
|
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));
|
|
|
|
for (ConsumerRecord<String, String> record : records) {
|
|
messageCount++;
|
|
System.out.printf("Message #%d: topic=%s partition=%d offset=%d key=%s value=%s%n",
|
|
messageCount, record.topic(), record.partition(), record.offset(),
|
|
record.key(), record.value());
|
|
}
|
|
|
|
// Stop after 100 messages or 60 seconds
|
|
if (messageCount >= 100 || (System.currentTimeMillis() - startTime) > 60000) {
|
|
long duration = System.currentTimeMillis() - startTime;
|
|
System.out.printf("%nSuccessfully consumed %d messages in %dms%n", messageCount, duration);
|
|
System.out.printf("Success rate: %.1f%% (%d/%d including errors)%n",
|
|
(double) messageCount / (messageCount + errorCount) * 100, messageCount,
|
|
messageCount + errorCount);
|
|
break;
|
|
}
|
|
} catch (Exception e) {
|
|
errorCount++;
|
|
System.err.printf("Error during poll #%d: %s%n", errorCount, e.getMessage());
|
|
e.printStackTrace();
|
|
|
|
// Stop after 10 consecutive errors or 60 seconds
|
|
if (errorCount > 10 || (System.currentTimeMillis() - startTime) > 60000) {
|
|
long duration = System.currentTimeMillis() - startTime;
|
|
System.err.printf("%nStopping after %d errors in %dms%n", errorCount, duration);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
} finally {
|
|
consumer.close();
|
|
}
|
|
}
|
|
}
|