diff --git a/akka-actor/src/main/scala/akka/actor/Actor.scala b/akka-actor/src/main/scala/akka/actor/Actor.scala index 618c442b89..5ce4478391 100644 --- a/akka-actor/src/main/scala/akka/actor/Actor.scala +++ b/akka-actor/src/main/scala/akka/actor/Actor.scala @@ -154,78 +154,6 @@ object Actor extends Logging { "\nOR try to change: 'actorOf[MyActor]' to 'actorOf(new MyActor)'.")) }, None) - /** - * Creates a Client-managed ActorRef out of the Actor of the specified Class. - * If the supplied host and port is identical of the configured local node, it will be a local actor - *
- * import Actor._ - * val actor = actorOf(classOf[MyActor],"www.akka.io",2552) - * actor.start - * actor ! message - * actor.stop - *- * You can create and start the actor in one statement like this: - *
- * val actor = actorOf(classOf[MyActor],"www.akka.io",2552).start - *- */ - def actorOf(factory: => Actor, host: String, port: Int): ActorRef = - ActorRegistry.remote.clientManagedActorOf(() => factory, host, port) - - /** - * Creates a Client-managed ActorRef out of the Actor of the specified Class. - * If the supplied host and port is identical of the configured local node, it will be a local actor - *
- * import Actor._ - * val actor = actorOf(classOf[MyActor],"www.akka.io",2552) - * actor.start - * actor ! message - * actor.stop - *- * You can create and start the actor in one statement like this: - *
- * val actor = actorOf(classOf[MyActor],"www.akka.io",2552).start - *- */ - def actorOf(clazz: Class[_ <: Actor], host: String, port: Int): ActorRef = { - import ReflectiveAccess.{ createInstance, noParams, noArgs } - ActorRegistry.remote.clientManagedActorOf(() => - createInstance[Actor](clazz.asInstanceOf[Class[_]], noParams, noArgs).getOrElse( - throw new ActorInitializationException( - "Could not instantiate Actor" + - "\nMake sure Actor is NOT defined inside a class/trait," + - "\nif so put it outside the class/trait, f.e. in a companion object," + - "\nOR try to change: 'actorOf[MyActor]' to 'actorOf(new MyActor)'.")), - host, port) - } - - /** - * Creates a Client-managed ActorRef out of the Actor of the specified Class. - * If the supplied host and port is identical of the configured local node, it will be a local actor - *
- * import Actor._
- * val actor = actorOf[MyActor]("www.akka.io",2552)
- * actor.start
- * actor ! message
- * actor.stop
- *
- * You can create and start the actor in one statement like this:
- *
- * val actor = actorOf[MyActor]("www.akka.io",2552).start
- *
- */
- def actorOf[T <: Actor : Manifest](host: String, port: Int): ActorRef = {
- import ReflectiveAccess.{ createInstance, noParams, noArgs }
- ActorRegistry.remote.clientManagedActorOf(() =>
- createInstance[Actor](manifest[T].erasure.asInstanceOf[Class[_]], noParams, noArgs).getOrElse(
- throw new ActorInitializationException(
- "Could not instantiate Actor" +
- "\nMake sure Actor is NOT defined inside a class/trait," +
- "\nif so put it outside the class/trait, f.e. in a companion object," +
- "\nOR try to change: 'actorOf[MyActor]' to 'actorOf(new MyActor)'.")),
- host, port)
- }
-
/**
* Creates an ActorRef out of the Actor. Allows you to pass in a factory function
* that creates the Actor. Please note that this function can be invoked multiple
diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala
index cfd1dd9904..98b45d7aca 100644
--- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala
+++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala
@@ -737,7 +737,7 @@ class LocalActorRef private[akka] (
*/
def spawnRemote(clazz: Class[_ <: Actor], hostname: String, port: Int, timeout: Long = Actor.TIMEOUT): ActorRef = guard.withGuard {
ensureRemotingEnabled
- val ref = Actor.actorOf(clazz, hostname, port)
+ val ref = ActorRegistry.remote.actorOf(clazz, hostname, port)
ref.timeout = timeout
ref.start
}
@@ -762,7 +762,7 @@ class LocalActorRef private[akka] (
def spawnLinkRemote(clazz: Class[_ <: Actor], hostname: String, port: Int, timeout: Long = Actor.TIMEOUT): ActorRef =
guard.withGuard {
ensureRemotingEnabled
- val actor = Actor.actorOf(clazz, hostname, port)
+ val actor = ActorRegistry.remote.actorOf(clazz, hostname, port)
actor.timeout = timeout
link(actor)
actor.start
diff --git a/akka-actor/src/main/scala/akka/remoteinterface/RemoteInterface.scala b/akka-actor/src/main/scala/akka/remoteinterface/RemoteInterface.scala
index 751bfbc188..94b60cbfc1 100644
--- a/akka-actor/src/main/scala/akka/remoteinterface/RemoteInterface.scala
+++ b/akka-actor/src/main/scala/akka/remoteinterface/RemoteInterface.scala
@@ -63,6 +63,80 @@ abstract class RemoteSupport extends ListenerManagement with RemoteServerModule
this.shutdownServerModule
clear
}
+
+
+ /**
+ * Creates a Client-managed ActorRef out of the Actor of the specified Class.
+ * If the supplied host and port is identical of the configured local node, it will be a local actor
+ * + * import Actor._ + * val actor = actorOf(classOf[MyActor],"www.akka.io",2552) + * actor.start + * actor ! message + * actor.stop + *+ * You can create and start the actor in one statement like this: + *
+ * val actor = actorOf(classOf[MyActor],"www.akka.io",2552).start + *+ */ + def actorOf(factory: => Actor, host: String, port: Int): ActorRef = + ActorRegistry.remote.clientManagedActorOf(() => factory, host, port) + + /** + * Creates a Client-managed ActorRef out of the Actor of the specified Class. + * If the supplied host and port is identical of the configured local node, it will be a local actor + *
+ * import Actor._ + * val actor = actorOf(classOf[MyActor],"www.akka.io",2552) + * actor.start + * actor ! message + * actor.stop + *+ * You can create and start the actor in one statement like this: + *
+ * val actor = actorOf(classOf[MyActor],"www.akka.io",2552).start + *+ */ + def actorOf(clazz: Class[_ <: Actor], host: String, port: Int): ActorRef = { + import ReflectiveAccess.{ createInstance, noParams, noArgs } + clientManagedActorOf(() => + createInstance[Actor](clazz.asInstanceOf[Class[_]], noParams, noArgs).getOrElse( + throw new ActorInitializationException( + "Could not instantiate Actor" + + "\nMake sure Actor is NOT defined inside a class/trait," + + "\nif so put it outside the class/trait, f.e. in a companion object," + + "\nOR try to change: 'actorOf[MyActor]' to 'actorOf(new MyActor)'.")), + host, port) + } + + /** + * Creates a Client-managed ActorRef out of the Actor of the specified Class. + * If the supplied host and port is identical of the configured local node, it will be a local actor + *
+ * import Actor._
+ * val actor = actorOf[MyActor]("www.akka.io",2552)
+ * actor.start
+ * actor ! message
+ * actor.stop
+ *
+ * You can create and start the actor in one statement like this:
+ *
+ * val actor = actorOf[MyActor]("www.akka.io",2552).start
+ *
+ */
+ def actorOf[T <: Actor : Manifest](host: String, port: Int): ActorRef = {
+ import ReflectiveAccess.{ createInstance, noParams, noArgs }
+ clientManagedActorOf(() =>
+ createInstance[Actor](manifest[T].erasure.asInstanceOf[Class[_]], noParams, noArgs).getOrElse(
+ throw new ActorInitializationException(
+ "Could not instantiate Actor" +
+ "\nMake sure Actor is NOT defined inside a class/trait," +
+ "\nif so put it outside the class/trait, f.e. in a companion object," +
+ "\nOR try to change: 'actorOf[MyActor]' to 'actorOf(new MyActor)'.")),
+ host, port)
+ }
+
protected override def manageLifeCycleOfListeners = false
protected[akka] override def notifyListeners(message: => Any): Unit = super.notifyListeners(message)
diff --git a/akka-remote/src/main/scala/akka/remote/NettyRemoteSupport.scala b/akka-remote/src/main/scala/akka/remote/NettyRemoteSupport.scala
index da0f326705..fff7d49185 100644
--- a/akka-remote/src/main/scala/akka/remote/NettyRemoteSupport.scala
+++ b/akka-remote/src/main/scala/akka/remote/NettyRemoteSupport.scala
@@ -564,7 +564,7 @@ class NettyRemoteSupport extends RemoteSupport with NettyRemoteServerModule with
protected[akka] def actorFor(serviceId: String, className: String, timeout: Long, host: String, port: Int, loader: Option[ClassLoader]): ActorRef = {
if (optimizeLocalScoped_?) {
val home = this.address
- if (host == home.getHostName && port == home.getPort) {//TODO: switch to InetSocketAddres.equals?
+ if (host == home.getHostName && port == home.getPort) {//TODO: switch to InetSocketAddress.equals?
val localRef = findActorByIdOrUuid(serviceId,serviceId)
if (localRef ne null) return localRef //Code significantly simpler with the return statement
@@ -575,6 +575,13 @@ class NettyRemoteSupport extends RemoteSupport with NettyRemoteServerModule with
}
def clientManagedActorOf(factory: () => Actor, host: String, port: Int): ActorRef = {
+
+ if (optimizeLocalScoped_?) {
+ val home = this.address
+ if (host == home.getHostName && port == home.getPort)//TODO: switch to InetSocketAddress.equals?
+ return new LocalActorRef(factory, None) // Code is much simpler with return
+ }
+
val ref = new LocalActorRef(factory, Some(new InetSocketAddress(host, port)))
//ref.timeout = timeout //removed because setting default timeout should be done after construction
ref
diff --git a/akka-remote/src/test/scala/remote/ClientInitiatedRemoteActorSpec.scala b/akka-remote/src/test/scala/remote/ClientInitiatedRemoteActorSpec.scala
index ad0028c8ea..3ffff3c3cd 100644
--- a/akka-remote/src/test/scala/remote/ClientInitiatedRemoteActorSpec.scala
+++ b/akka-remote/src/test/scala/remote/ClientInitiatedRemoteActorSpec.scala
@@ -76,7 +76,7 @@ class MyActorCustomConstructor extends Actor {
class ClientInitiatedRemoteActorSpec extends AkkaRemoteTest {
"ClientInitiatedRemoteActor" should {
"shouldSendOneWay" in {
- val clientManaged = actorOf[RemoteActorSpecActorUnidirectional](host,port).start
+ val clientManaged = remote.actorOf[RemoteActorSpecActorUnidirectional](host,port).start
clientManaged must not be null
clientManaged.getClass must be (classOf[LocalActorRef])
clientManaged ! "OneWay"
@@ -86,7 +86,7 @@ class ClientInitiatedRemoteActorSpec extends AkkaRemoteTest {
"shouldSendOneWayAndReceiveReply" in {
val latch = new CountDownLatch(1)
- val actor = actorOf[SendOneWayAndReplyReceiverActor](host,port).start
+ val actor = remote.actorOf[SendOneWayAndReplyReceiverActor](host,port).start
implicit val sender = Some(actorOf(new CountDownActor(latch)).start)
actor ! "Hello"
@@ -95,14 +95,14 @@ class ClientInitiatedRemoteActorSpec extends AkkaRemoteTest {
}
"shouldSendBangBangMessageAndReceiveReply" in {
- val actor = actorOf[RemoteActorSpecActorBidirectional](host,port).start
+ val actor = remote.actorOf[RemoteActorSpecActorBidirectional](host,port).start
val result = actor !! "Hello"
"World" must equal (result.get.asInstanceOf[String])
actor.stop
}
"shouldSendBangBangMessageAndReceiveReplyConcurrently" in {
- val actors = (1 to 10).map(num => { actorOf[RemoteActorSpecActorBidirectional](host,port).start }).toList
+ val actors = (1 to 10).map(num => { remote.actorOf[RemoteActorSpecActorBidirectional](host,port).start }).toList
actors.map(_ !!! "Hello") foreach { future =>
"World" must equal (future.await.result.asInstanceOf[Option[String]].get)
}
@@ -110,8 +110,8 @@ class ClientInitiatedRemoteActorSpec extends AkkaRemoteTest {
}
"shouldRegisterActorByUuid" in {
- val actor1 = actorOf[MyActorCustomConstructor](host, port).start
- val actor2 = actorOf[MyActorCustomConstructor](host, port).start
+ val actor1 = remote.actorOf[MyActorCustomConstructor](host, port).start
+ val actor2 = remote.actorOf[MyActorCustomConstructor](host, port).start
actor1 ! "incrPrefix"
@@ -129,7 +129,7 @@ class ClientInitiatedRemoteActorSpec extends AkkaRemoteTest {
"shouldSendAndReceiveRemoteException" in {
- val actor = actorOf[RemoteActorSpecActorBidirectional](host, port).start
+ val actor = remote.actorOf[RemoteActorSpecActorBidirectional](host, port).start
try {
implicit val timeout = 500000000L
val f = (actor !!! "Failure").await.resultOrException
diff --git a/akka-remote/src/test/scala/remote/RemoteSupervisorSpec.scala b/akka-remote/src/test/scala/remote/RemoteSupervisorSpec.scala
index 33760028fb..550c883800 100644
--- a/akka-remote/src/test/scala/remote/RemoteSupervisorSpec.scala
+++ b/akka-remote/src/test/scala/remote/RemoteSupervisorSpec.scala
@@ -228,7 +228,7 @@ class RemoteSupervisorSpec extends AkkaRemoteTest {
// Then create a concrete container in which we mix in support for the specific
// implementation of the Actors we want to use.
- pingpong1 = actorOf[RemotePingPong1Actor](host,port).start
+ pingpong1 = remote.actorOf[RemotePingPong1Actor](host,port).start
val factory = SupervisorFactory(
SupervisorConfig(
@@ -242,7 +242,7 @@ class RemoteSupervisorSpec extends AkkaRemoteTest {
}
def getSingleActorOneForOneSupervisor: Supervisor = {
- pingpong1 = actorOf[RemotePingPong1Actor](host,port).start
+ pingpong1 = remote.actorOf[RemotePingPong1Actor](host,port).start
val factory = SupervisorFactory(
SupervisorConfig(
@@ -255,9 +255,9 @@ class RemoteSupervisorSpec extends AkkaRemoteTest {
}
def getMultipleActorsAllForOneConf: Supervisor = {
- pingpong1 = actorOf[RemotePingPong1Actor](host,port).start
- pingpong2 = actorOf[RemotePingPong2Actor](host,port).start
- pingpong3 = actorOf[RemotePingPong3Actor](host,port).start
+ pingpong1 = remote.actorOf[RemotePingPong1Actor](host,port).start
+ pingpong2 = remote.actorOf[RemotePingPong2Actor](host,port).start
+ pingpong3 = remote.actorOf[RemotePingPong3Actor](host,port).start
val factory = SupervisorFactory(
SupervisorConfig(
@@ -278,9 +278,9 @@ class RemoteSupervisorSpec extends AkkaRemoteTest {
}
def getMultipleActorsOneForOneConf: Supervisor = {
- pingpong1 = actorOf[RemotePingPong1Actor](host,port).start
- pingpong2 = actorOf[RemotePingPong2Actor](host,port).start
- pingpong3 = actorOf[RemotePingPong3Actor](host,port).start
+ pingpong1 = remote.actorOf[RemotePingPong1Actor](host,port).start
+ pingpong2 = remote.actorOf[RemotePingPong2Actor](host,port).start
+ pingpong3 = remote.actorOf[RemotePingPong3Actor](host,port).start
val factory = SupervisorFactory(
SupervisorConfig(
@@ -301,9 +301,9 @@ class RemoteSupervisorSpec extends AkkaRemoteTest {
}
def getNestedSupervisorsAllForOneConf: Supervisor = {
- pingpong1 = actorOf[RemotePingPong1Actor](host,port).start
- pingpong2 = actorOf[RemotePingPong2Actor](host,port).start
- pingpong3 = actorOf[RemotePingPong3Actor](host,port).start
+ pingpong1 = remote.actorOf[RemotePingPong1Actor](host,port).start
+ pingpong2 = remote.actorOf[RemotePingPong2Actor](host,port).start
+ pingpong3 = remote.actorOf[RemotePingPong3Actor](host,port).start
val factory = SupervisorFactory(
SupervisorConfig(
diff --git a/akka-samples/akka-sample-remote/src/main/scala/ClientManagedRemoteActorSample.scala b/akka-samples/akka-sample-remote/src/main/scala/ClientManagedRemoteActorSample.scala
index 76ab88c7fb..52281f4fbe 100644
--- a/akka-samples/akka-sample-remote/src/main/scala/ClientManagedRemoteActorSample.scala
+++ b/akka-samples/akka-sample-remote/src/main/scala/ClientManagedRemoteActorSample.scala
@@ -7,6 +7,7 @@ package sample.remote
import akka.actor.Actor._
import akka.util.Logging
import akka.actor. {ActorRegistry, Actor}
+import ActorRegistry.remote
class RemoteHelloWorldActor extends Actor {
def receive = {
@@ -18,7 +19,7 @@ class RemoteHelloWorldActor extends Actor {
object ClientManagedRemoteActorServer extends Logging {
def run = {
- ActorRegistry.remote.start("localhost", 2552)
+ remote.start("localhost", 2552)
log.slf4j.info("Remote node started")
}
@@ -28,7 +29,7 @@ object ClientManagedRemoteActorServer extends Logging {
object ClientManagedRemoteActorClient extends Logging {
def run = {
- val actor = actorOf[RemoteHelloWorldActor]("localhost",2552).start
+ val actor = remote.actorOf[RemoteHelloWorldActor]("localhost",2552).start
log.slf4j.info("Remote actor created, moved to the server")
log.slf4j.info("Sending 'Hello' to remote actor")
val result = actor !! "Hello"
diff --git a/akka-typed-actor/src/main/scala/akka/actor/TypedActor.scala b/akka-typed-actor/src/main/scala/akka/actor/TypedActor.scala
index 34288f1637..e39be47549 100644
--- a/akka-typed-actor/src/main/scala/akka/actor/TypedActor.scala
+++ b/akka-typed-actor/src/main/scala/akka/actor/TypedActor.scala
@@ -488,7 +488,7 @@ object TypedActor extends Logging {
config match {
case null => actorOf(typedActor)
case c: TypedActorConfiguration if (c._host.isDefined) =>
- actorOf(typedActor, c._host.get.getHostName, c._host.get.getPort)
+ ActorRegistry.remote.actorOf(typedActor, c._host.get.getHostName, c._host.get.getPort)
case _ => actorOf(typedActor)
}
}
diff --git a/akka-typed-actor/src/main/scala/akka/config/TypedActorGuiceConfigurator.scala b/akka-typed-actor/src/main/scala/akka/config/TypedActorGuiceConfigurator.scala
index 93639460b0..1669122812 100644
--- a/akka-typed-actor/src/main/scala/akka/config/TypedActorGuiceConfigurator.scala
+++ b/akka-typed-actor/src/main/scala/akka/config/TypedActorGuiceConfigurator.scala
@@ -112,7 +112,7 @@ private[akka] class TypedActorGuiceConfigurator extends TypedActorConfiguratorBa
component.remoteAddress match {
case Some(a) =>
(Some(new InetSocketAddress(a.hostname, a.port)),
- Actor.actorOf(TypedActor.newTypedActor(implementationClass), a.hostname, a.port))
+ ActorRegistry.remote.actorOf(TypedActor.newTypedActor(implementationClass), a.hostname, a.port))
case None =>
(None, Actor.actorOf(TypedActor.newTypedActor(implementationClass)))
}