diff --git a/akka-actor/src/main/scala/akka/dispatch/Future.scala b/akka-actor/src/main/scala/akka/dispatch/Future.scala index 26375bddf1..2a5ff54ff5 100644 --- a/akka-actor/src/main/scala/akka/dispatch/Future.scala +++ b/akka-actor/src/main/scala/akka/dispatch/Future.scala @@ -169,6 +169,17 @@ sealed trait Future[T] { def onComplete(func: Future[T] => Unit): Future[T] + /** + * When the future is compeleted, apply the result to the provided PartialFunction if a match is found + */ + final def receive(pf: PartialFunction[Any, Unit]): Future[T] = onComplete { f => + val optr = f.result + if (optr.isDefined) { + val r = optr.get + if (pf.isDefinedAt(r)) pf(r) + } + } + /** * Returns the current result, throws the exception is one has been raised, else returns None */ diff --git a/akka-actor/src/test/scala/akka/dispatch/FutureSpec.scala b/akka-actor/src/test/scala/akka/dispatch/FutureSpec.scala index 4aa25d3f05..d2b442c656 100644 --- a/akka-actor/src/test/scala/akka/dispatch/FutureSpec.scala +++ b/akka-actor/src/test/scala/akka/dispatch/FutureSpec.scala @@ -204,4 +204,12 @@ class FutureSpec extends JUnitSuite { assert(undone.size === 5) assert(errors.size === 0) } + + @Test def receiveShouldExecuteOnComplete { + val latch = new StandardLatch + val actor = actorOf[TestActor].start + actor !!! "Hello" receive { case "World" => latch.open } + assert(latch.tryAwait(5, TimeUnit.SECONDS)) + actor.stop + } }