The asynchronous sending of a message returns no error even if the
Kafka server is not started.
For all the following tests, the local Kafka server is stopped. First,
consider this piece of code:
public static void main(String[] args) throws Exception {
Properties config = new Properties();
config.put("client.id", InetAddress.getLocalHost().getHostName());
config.put("bootstrap.servers", "localhost:9092");
config.put("acks", "all");
config.put("key.serializer",
"org.apache.kafka.common.serialization.StringSerializer");
config.put("value.serializer",
"org.apache.kafka.common.serialization.StringSerializer");
try (Producer<String, String> producer = new KafkaProducer<>(config);) {
ProducerRecord<String, String> record = new
ProducerRecord<>("test-topic", null, "a-little-message");
producer.send(record, new Callback() {
@Override
public void onCompletion(RecordMetadata metadata, Exception exception) {
if (exception != null) {
System.out.println("Exceptoin occurred!");
exception.printStackTrace(System.out);
}
}
});
}
}
Running it will produce the following error:
Exception occurred!
org.apache.kafka.common.errors.TimeoutException: Failed to update
metadata after 60000 ms.
Second, consider this piece of code:
public static void main(String[] args) throws Exception {
Properties config = new Properties();
config.put("client.id", InetAddress.getLocalHost().getHostName());
config.put("bootstrap.servers", "localhost:9092");
config.put("acks", "all");
config.put("key.serializer",
"org.apache.kafka.common.serialization.StringSerializer");
config.put("value.serializer",
"org.apache.kafka.common.serialization.StringSerializer");
try (Producer<String, String> producer = new KafkaProducer<>(config);) {
ProducerRecord<String, String> record = new
ProducerRecord<>("test-topic", null, "a-little-message");
System.out.println("Sending a message...");
producer.send(record).get();
System.out.println("Message sent");
}
}
Running it will produce the following error:
Sending a message...
Exception in thread "main" java.util.concurrent.ExecutionException:
org.apache.kafka.common.errors.TimeoutException: Failed to update
metadata after 60000 ms.
at
org.apache.kafka.clients.producer.KafkaProducer$FutureFailure.<init>(KafkaProducer.java:1168)
at
org.apache.kafka.clients.producer.KafkaProducer.doSend(KafkaProducer.java:859)
at org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:797)
at org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:684)
at com.xdf.foreign.KafkaTest.main(KafkaTest.java:46)
Caused by: org.apache.kafka.common.errors.TimeoutException: Failed to
update metadata after 60000 ms.
Third, consider this piece of code:
public static void main(String[] args) throws Exception {
Properties config = new Properties();
config.put("client.id", InetAddress.getLocalHost().getHostName());
config.put("bootstrap.servers", "localhost:9092");
config.put("acks", "all");
config.put("key.serializer",
"org.apache.kafka.common.serialization.StringSerializer");
config.put("value.serializer",
"org.apache.kafka.common.serialization.StringSerializer");
try (Producer<String, String> producer = new KafkaProducer<>(config);) {
ProducerRecord<String, String> record = new
ProducerRecord<>("test-topic", null, "a-little-message");
System.out.println("Sending a message...");
producer.send(record);
System.out.println("Message sent");
}
}
Running it will produce no error. The following output will be
produced:
Sending a message...
Message sent
I know that the nature of asynchronous sending demands that send
method ignore connection error to the Kafka server. But I think that
it is better to document this kind of behaviour somewhere.
--
Jingguo