com.twitter.util.Await不会引发com.twitter.util.TimeoutException

时间:2018-08-20 16:14:26

标签: scala finagle twitter-util

我希望此代码将引发TimeoutException,但不会。我该怎么办?

import com.twitter.conversions.time._
import com.twitter.util.{Await, Future}


object Tmp {

  def main(args: Array[String]): Unit = {
    Await.result(
      Future{
        Thread.sleep(10000000)
      },
        1 second
    )
  }
}

1 个答案:

答案 0 :(得分:3)

Future.apply方法的scaladoc有一个注释,指出:

  

a在调用线程中执行,因此必须特别注意阻塞代码。

因此,通常,您不应该对期货执行冻结操作。

如果要阻止通话,则应使用com.twitter.util.FuturePool。可以在Twitter Util文档的Blocking or synchronous work部分中找到有关执行阻止调用的更多背景。

因此您的代码应如下所示:

import com.twitter.conversions.time._
import com.twitter.util.{Await, FuturePool}

object Tmp {
  def main(args: Array[String]): Unit = {
    Await.result(
      FuturePool.unboundedPool {
        Thread.sleep(5000)
      },
      1 second
    )
  }
}

在此示例中,我以unboundedPool作为快速示例。但是请检查FuturePool documentation,以找到适合您的用例的FuturePool