【发布时间】:2017-11-17 23:35:09
【问题描述】:
我有一个使用 future 进行异步执行的应用程序。
我在 get 方法上设置了参数,线程应该在 10 秒后被杀死,当它没有得到响应时:
Future<RecordMetadata> meta = producer.send(record, new ProducerCallBack());
RecordMetadata data = meta.get(10, TimeUnit.SECONDS);
但是线程在 60 秒后被杀死:
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:1124)
at org.apache.kafka.clients.producer.KafkaProducer.doSend(KafkaProducer.java:823)
at org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:760)
at io.khinkali.KafkaProducerClient.main(KafkaProducerClient.java:49)
Caused by: org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms.
我做错了什么?
【问题讨论】:
-
使用更高的超时值
-
我把它改成 10 秒。
-
我没有启动 kafka 服务器,因为我想弄清楚异常是否被捕获。
-
这里有两种不同的超时。 10 秒没有指定它应该在等待后中止。您给“get”的超时仅表示“等待结果 10 秒,如果到那时还没有准备好,就继续。”
标签: java multithreading apache-kafka