【问题标题】:Why doesn't Future.get(...) kill the thread?为什么 Future.get(...) 不杀死线程?
【发布时间】: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


【解决方案1】:

来自docs

阻塞时间的阈值由 max.block.ms 决定 它会引发 TimeoutException。

检查logback.xml中的Kafka Appender配置,查找:

<producerConfig>max.block.ms=60000</producerConfig>

【讨论】:

    【解决方案2】:

    我在 get 方法上设置了参数,当线程没有得到响应时,应该在 10 秒后被杀死:

    如果我们谈论的是Future.get(...),那么它根本不会“杀死”线程。引用javadocsFuture.get(...) 方法:

    如有必要,最多等待给定的时间以完成计算,然后检索其结果(如果可用)。

    如果get(...) 方法超时,那么它将抛出TimeoutException,但您的线程可以继续运行。如果你想停止线程运行,那么你需要捕获TimeoutException,然后调用meta.cancel(true),但即使这样也不能保证线程会被“杀死”。这会导致线程被中断,这意味着certain methods will throw InterruptedException 或线程需要检查Thread.currentThread().isInterrupted()

    java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: 60000 毫秒后更新元数据失败。

    是的,这个超时与Future.get(...) 超时无关。

    【讨论】:

      猜你喜欢
      • 2019-06-16
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-10
      • 2014-12-17
      • 1970-01-01
      相关资源
      最近更新 更多