From 9df923dd169a498815eb31bd1befb249232ece28 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Thu, 11 Nov 2010 19:41:06 +0100 Subject: [PATCH] Fixing ticket #519 --- .../src/main/scala/remote/RemoteServer.scala | 5 +++- .../src/test/scala/ticket/Ticket519Spec.scala | 30 +++++++++++++++++++ .../src/main/scala/actor/TypedActor.scala | 2 +- 3 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 akka-remote/src/test/scala/ticket/Ticket519Spec.scala diff --git a/akka-remote/src/main/scala/remote/RemoteServer.scala b/akka-remote/src/main/scala/remote/RemoteServer.scala index b14e514b32..62179ed11c 100644 --- a/akka-remote/src/main/scala/remote/RemoteServer.scala +++ b/akka-remote/src/main/scala/remote/RemoteServer.scala @@ -589,7 +589,10 @@ class RemoteServerHandler( val messageReceiver = typedActor.getClass.getDeclaredMethod(typedActorInfo.getMethod, argClasses: _*) if (request.getOneWay) messageReceiver.invoke(typedActor, args: _*) else { - val result = messageReceiver.invoke(typedActor, args: _*) + val result = messageReceiver.invoke(typedActor, args: _*) match { + case f: Future[_] => f.await.result.get + case other => other + } log.debug("Returning result from remote typed actor invocation [%s]", result) val messageBuilder = RemoteActorSerialization.createRemoteMessageProtocolBuilder( diff --git a/akka-remote/src/test/scala/ticket/Ticket519Spec.scala b/akka-remote/src/test/scala/ticket/Ticket519Spec.scala new file mode 100644 index 0000000000..8457f10f45 --- /dev/null +++ b/akka-remote/src/test/scala/ticket/Ticket519Spec.scala @@ -0,0 +1,30 @@ +/** + * Copyright (C) 2009-2010 Scalable Solutions AB + */ +package akka.actor.ticket + +import org.scalatest.Spec +import org.scalatest.matchers.ShouldMatchers +import akka.remote.{RemoteClient, RemoteServer} +import akka.actor._ + + +class Ticket519Spec extends Spec with ShouldMatchers { + + val HOSTNAME = "localhost" + val PORT = 6666 + + describe("A remote TypedActor") { + it("should handle remote future replies") { + import akka.remote._ + + val server = { val s = new RemoteServer; s.start(HOSTNAME,PORT); s} + val actor = TypedActor.newRemoteInstance(classOf[SamplePojo], classOf[SamplePojoImpl],7000,HOSTNAME,PORT) + val r = actor.someFutureString + + r.await.result.get should equal ("foo") + TypedActor.stop(actor) + server.shutdown + } + } +} diff --git a/akka-typed-actor/src/main/scala/actor/TypedActor.scala b/akka-typed-actor/src/main/scala/actor/TypedActor.scala index 75d4764c55..3ad5468369 100644 --- a/akka-typed-actor/src/main/scala/actor/TypedActor.scala +++ b/akka-typed-actor/src/main/scala/actor/TypedActor.scala @@ -850,7 +850,7 @@ private[akka] abstract class ActorAspect { ActorType.TypedActor) if (isOneWay) null // for void methods - //else if (TypedActor.returnsFuture_?(methodRtti)) future.get + else if (TypedActor.returnsFuture_?(methodRtti)) future.get else { if (future.isDefined) { future.get.await