From bb88aed56e7709a29c451efe647c5fedca026a8e Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Mon, 25 Feb 2013 13:58:51 +0100 Subject: [PATCH] #3085 - Fixing so that option-returning TypedACtor calls return None --- .../src/test/scala/akka/actor/TypedActorSpec.scala | 6 ++++++ akka-actor/src/main/scala/akka/actor/TypedActor.scala | 7 +++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/actor/TypedActorSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/TypedActorSpec.scala index 01b3742304..852f672344 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/TypedActorSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/TypedActorSpec.scala @@ -324,6 +324,12 @@ class TypedActorSpec extends AkkaSpec(TypedActorSpec.config) mustStop(t) } + "be able to handle AskTimeoutException as None" taggedAs TimingTest in { + val t = newFooBar(200 millis) + t.joptionPigdog(600 millis) must be(JOption.none[String]) + mustStop(t) + } + "be able to call methods returning Scala Options" taggedAs TimingTest in { val t = newFooBar(1 second) t.optionPigdog(100 millis).get must be("Pigdog") diff --git a/akka-actor/src/main/scala/akka/actor/TypedActor.scala b/akka-actor/src/main/scala/akka/actor/TypedActor.scala index e159ff96fe..61cc9ee0c7 100644 --- a/akka-actor/src/main/scala/akka/actor/TypedActor.scala +++ b/akka-actor/src/main/scala/akka/actor/TypedActor.scala @@ -23,6 +23,7 @@ import java.util.concurrent.TimeoutException import java.util.concurrent.TimeUnit.MILLISECONDS import java.io.ObjectStreamException import java.lang.reflect.{ InvocationTargetException, Method, InvocationHandler, Proxy } +import akka.pattern.AskTimeoutException /** * A TypedActorFactory is something that can created TypedActor instances. @@ -421,8 +422,10 @@ object TypedActor extends ExtensionId[TypedActorExtension] with ExtensionIdProvi case m if m.returnsJOption || m.returnsOption ⇒ val f = ask(actor, m)(timeout) (try { Await.ready(f, timeout.duration).value } catch { case _: TimeoutException ⇒ None }) match { - case None | Some(Success(NullResponse)) ⇒ if (m.returnsJOption) JOption.none[Any] else None - case Some(t: Try[_]) ⇒ t.get.asInstanceOf[AnyRef] + case None | Some(Success(NullResponse)) | Some(Failure(_: AskTimeoutException)) ⇒ + if (m.returnsJOption) JOption.none[Any] else None + case Some(t: Try[_]) ⇒ + t.get.asInstanceOf[AnyRef] } case m ⇒ Await.result(ask(actor, m)(timeout), timeout.duration) match { case NullResponse ⇒ null