diff --git a/akka-actor/src/main/scala/akka/routing/Routing.scala b/akka-actor/src/main/scala/akka/routing/Routing.scala index 6c7f47fc32..2b4502430f 100644 --- a/akka-actor/src/main/scala/akka/routing/Routing.scala +++ b/akka-actor/src/main/scala/akka/routing/Routing.scala @@ -5,12 +5,12 @@ package akka.routing import language.implicitConversions import language.postfixOps - import akka.actor._ import scala.concurrent.util.Duration import scala.concurrent.util.duration._ import akka.ConfigurationException import akka.pattern.pipe +import akka.pattern.pipe import com.typesafe.config.Config import scala.collection.JavaConversions.iterableAsScalaIterable import java.util.concurrent.atomic.{ AtomicLong, AtomicBoolean } @@ -19,6 +19,7 @@ import scala.concurrent.forkjoin.ThreadLocalRandom import akka.dispatch.Dispatchers import scala.annotation.tailrec import concurrent.ExecutionContext +import akka.dispatch.MessageDispatcher /** * A RoutedActorRef is an ActorRef that has a set of connected ActorRef and it uses a Router to @@ -45,7 +46,7 @@ private[akka] class RoutedActorCell(_system: ActorSystemImpl, _ref: InternalActo _system, _ref, _props.copy(creator = () ⇒ _props.routerConfig.createActor(), dispatcher = _props.routerConfig.routerDispatcher), - _supervisor) { + _supervisor) with RouterContext { private[akka] val routerConfig = _props.routerConfig private[akka] val resizeInProgress = new AtomicBoolean @@ -140,6 +141,27 @@ private[akka] class RoutedActorCell(_system: ActorSystemImpl, _ref: InternalActo } } +/** + * Contextual information for [[akka.routing.RouterConfig]] + * [[akka.routing.RouteeProvider]] + * It's a subset of [[akka.actor.ActorContext]]. + */ +trait RouterContext { + + def system: ActorSystem + + def self: ActorRef + + implicit def dispatcher: MessageDispatcher + + def actorOf(props: Props): ActorRef + + def actorOf(props: Props, name: String): ActorRef + + def actorFor(path: String): ActorRef + +} + /** * This trait represents a router factory: it produces the actual router actor * and creates the routing table (a function which determines the recipients @@ -162,7 +184,7 @@ trait RouterConfig { def createRoute(routeeProvider: RouteeProvider): Route - def createRouteeProvider(context: ActorContext, routeeProps: Props): RouteeProvider = + def createRouteeProvider(context: RouterContext, routeeProps: Props): RouteeProvider = new RouteeProvider(context, routeeProps, resizer) def createActor(): Router = new Router { @@ -205,7 +227,7 @@ trait RouterConfig { * Uses `context.actorOf` to create routees from nrOfInstances property * and `context.actorFor` lookup routees from paths. */ -class RouteeProvider(val context: ActorContext, val routeeProps: Props, val resizer: Option[Resizer]) { +class RouteeProvider(val context: RouterContext, val routeeProps: Props, val resizer: Option[Resizer]) { /** * Adds the routees to the router. @@ -1140,7 +1162,7 @@ trait ScatterGatherFirstCompletedLike { this: RouterConfig ⇒ { case (sender, message) ⇒ val provider: ActorRefProvider = routeeProvider.context.asInstanceOf[ActorCell].systemImpl.provider - implicit val ec = provider.dispatcher + import routeeProvider.context.dispatcher val asker = akka.pattern.PromiseActorRef(provider, within) asker.result.future.pipeTo(sender) toAll(asker, routeeProvider.routees) diff --git a/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala b/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala index c0ce6eb359..9bc4781633 100644 --- a/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala +++ b/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala @@ -8,7 +8,6 @@ import scala.collection.immutable.SortedSet import com.typesafe.config.ConfigFactory import akka.ConfigurationException import akka.actor.Actor -import akka.actor.ActorContext import akka.actor.ActorRef import akka.actor.ActorSystemImpl import akka.actor.Address @@ -31,6 +30,7 @@ import akka.cluster.ClusterScope import akka.routing.RoundRobinRouter import akka.routing.Destination import java.lang.IllegalStateException +import akka.routing.RouterContext /** * [[akka.routing.RouterConfig]] implementation for deployment on cluster nodes. @@ -40,7 +40,7 @@ import java.lang.IllegalStateException */ case class ClusterRouterConfig(local: RouterConfig, totalInstances: Int, maxInstancesPerNode: Int) extends RouterConfig { - override def createRouteeProvider(context: ActorContext, routeeProps: Props) = + override def createRouteeProvider(context: RouterContext, routeeProps: Props) = new ClusterRouteeProvider(context, routeeProps, resizer, totalInstances, maxInstancesPerNode) override def createRoute(routeeProvider: RouteeProvider): Route = { @@ -73,7 +73,7 @@ case class ClusterRouterConfig(local: RouterConfig, totalInstances: Int, maxInst * Deploys new routees on the cluster nodes. */ private[akka] class ClusterRouteeProvider( - _context: ActorContext, + _context: RouterContext, _routeeProps: Props, _resizer: Option[Resizer], totalInstances: Int, diff --git a/akka-remote/src/main/scala/akka/routing/RemoteRouterConfig.scala b/akka-remote/src/main/scala/akka/routing/RemoteRouterConfig.scala index 183ba66beb..f0c0f10cdd 100644 --- a/akka-remote/src/main/scala/akka/routing/RemoteRouterConfig.scala +++ b/akka-remote/src/main/scala/akka/routing/RemoteRouterConfig.scala @@ -4,7 +4,6 @@ package akka.routing import com.typesafe.config.ConfigFactory -import akka.actor.ActorContext import akka.actor.ActorRef import akka.actor.ActorSystemImpl import akka.actor.Deploy @@ -29,7 +28,7 @@ case class RemoteRouterConfig(local: RouterConfig, nodes: Iterable[Address]) ext def this(local: RouterConfig, nodes: java.lang.Iterable[Address]) = this(local, nodes.asScala) def this(local: RouterConfig, nodes: Array[Address]) = this(local, nodes: Iterable[Address]) - override def createRouteeProvider(context: ActorContext, routeeProps: Props) = + override def createRouteeProvider(context: RouterContext, routeeProps: Props) = new RemoteRouteeProvider(nodes, context, routeeProps, resizer) override def createRoute(routeeProvider: RouteeProvider): Route = { @@ -56,7 +55,7 @@ case class RemoteRouterConfig(local: RouterConfig, nodes: Iterable[Address]) ext * * Routee paths may not be combined with remote target nodes. */ -class RemoteRouteeProvider(nodes: Iterable[Address], _context: ActorContext, _routeeProps: Props, _resizer: Option[Resizer]) +class RemoteRouteeProvider(nodes: Iterable[Address], _context: RouterContext, _routeeProps: Props, _resizer: Option[Resizer]) extends RouteeProvider(_context, _routeeProps, _resizer) { if (nodes.isEmpty) throw new ConfigurationException("Must specify list of remote target.nodes for [%s]"