Skip to content

Instantly share code, notes, and snippets.

@rtitle
Last active May 19, 2017 00:31
Show Gist options
  • Save rtitle/9feb9359cec685a4319eb30463ac34d6 to your computer and use it in GitHub Desktop.
Save rtitle/9feb9359cec685a4319eb30463ac34d6 to your computer and use it in GitHub Desktop.
Future with timeout
scala> :paste
// Entering paste mode (ctrl-D to finish)
import scala.concurrent._
import scala.concurrent.duration._
import ExecutionContext.Implicits.global
import akka.actor._
import akka.pattern.after
implicit class FutureWithTimeout[A](f: Future[A]) {
def withTimeout(duration: FiniteDuration)(implicit system: ActorSystem): Future[A] =
Future.firstCompletedOf(Seq(f, after(duration, system.scheduler)(Future.failed(new TimeoutException("Future timed out!")))))
}
// Demo!
implicit val sys = ActorSystem("sys")
val future = Future(Thread.sleep(1000*60*60*24*365)) // 1 year
Await.result(future.withTimeout(5 seconds), 365 days)
// Exiting paste mode, now interpreting.
java.util.concurrent.TimeoutException: Future timed out!
at FutureWithTimeout$$anonfun$withTimeout$1.apply(<console>:19)
at FutureWithTimeout$$anonfun$withTimeout$1.apply(<console>:19)
at akka.pattern.FutureTimeoutSupport$$anonfun$after$1.liftedTree1$1(FutureTimeoutSupport.scala:23)
at akka.pattern.FutureTimeoutSupport$$anonfun$after$1.apply$mcV$sp(FutureTimeoutSupport.scala:23)
at akka.actor.Scheduler$$anon$7.run(Scheduler.scala:117)
at scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment