2012-04-25 18:34:16 +02:00
|
|
|
package akka.pattern
|
|
|
|
|
|
|
|
|
|
/**
|
2014-02-02 19:05:45 -06:00
|
|
|
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
|
2012-04-25 18:34:16 +02:00
|
|
|
*/
|
|
|
|
|
|
2012-09-21 14:50:06 +02:00
|
|
|
import scala.concurrent.duration.Duration
|
2012-07-04 15:25:30 +02:00
|
|
|
import scala.concurrent.{ ExecutionContext, Promise, Future }
|
2012-04-25 18:34:16 +02:00
|
|
|
import akka.actor._
|
2012-07-22 15:33:18 +02:00
|
|
|
import scala.util.control.NonFatal
|
2012-09-21 14:50:06 +02:00
|
|
|
import scala.concurrent.duration.FiniteDuration
|
2012-04-25 18:34:16 +02:00
|
|
|
|
|
|
|
|
trait FutureTimeoutSupport {
|
|
|
|
|
/**
|
2012-07-04 15:25:30 +02:00
|
|
|
* Returns a [[scala.concurrent.Future]] that will be completed with the success or failure of the provided value
|
2012-04-25 18:34:16 +02:00
|
|
|
* after the specified duration.
|
|
|
|
|
*/
|
2012-09-18 09:58:30 +02:00
|
|
|
def after[T](duration: FiniteDuration, using: Scheduler)(value: ⇒ Future[T])(implicit ec: ExecutionContext): Future[T] =
|
2012-07-22 15:33:18 +02:00
|
|
|
if (duration.isFinite() && duration.length < 1) {
|
|
|
|
|
try value catch { case NonFatal(t) ⇒ Future.failed(t) }
|
|
|
|
|
} else {
|
2012-04-25 18:34:16 +02:00
|
|
|
val p = Promise[T]()
|
2012-07-22 15:33:18 +02:00
|
|
|
using.scheduleOnce(duration) { p completeWith { try value catch { case NonFatal(t) ⇒ Future.failed(t) } } }
|
|
|
|
|
p.future
|
2012-04-25 18:34:16 +02:00
|
|
|
}
|
2013-01-09 01:47:48 +01:00
|
|
|
}
|