Last active
May 19, 2017 00:31
-
-
Save rtitle/9feb9359cec685a4319eb30463ac34d6 to your computer and use it in GitHub Desktop.
Future with timeout
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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