diff --git a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala index c6ae1b11fc..6be3618b17 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala @@ -158,14 +158,14 @@ class LocalActorRefProvider extends ActorRefProvider { // create a routed actor ref case deploy @ Some(DeploymentConfig.Deploy(_, _, routerType, nrOfInstances, _, DeploymentConfig.LocalScope)) ⇒ val routerFactory: () ⇒ Router = DeploymentConfig.routerTypeFor(routerType) match { - case RouterType.Direct ⇒ () ⇒ new DirectRouter - case RouterType.Random ⇒ () ⇒ new RandomRouter - case RouterType.RoundRobin ⇒ () ⇒ new RoundRobinRouter - case RouterType.ScatterGather ⇒ () ⇒ new ScatterGatherFirstCompletedRouter - case RouterType.LeastCPU ⇒ sys.error("Router LeastCPU not supported yet") - case RouterType.LeastRAM ⇒ sys.error("Router LeastRAM not supported yet") - case RouterType.LeastMessages ⇒ sys.error("Router LeastMessages not supported yet") - case RouterType.Custom ⇒ sys.error("Router Custom not supported yet") + case RouterType.Direct ⇒ () ⇒ new DirectRouter + case RouterType.Random ⇒ () ⇒ new RandomRouter + case RouterType.RoundRobin ⇒ () ⇒ new RoundRobinRouter + case RouterType.ScatterGather ⇒ () ⇒ new ScatterGatherFirstCompletedRouter + case RouterType.LeastCPU ⇒ sys.error("Router LeastCPU not supported yet") + case RouterType.LeastRAM ⇒ sys.error("Router LeastRAM not supported yet") + case RouterType.LeastMessages ⇒ sys.error("Router LeastMessages not supported yet") + case RouterType.Custom(implClass) ⇒ () ⇒ Routing.createCustomRouter(implClass) } val connections: Iterable[ActorRef] = diff --git a/akka-actor/src/main/scala/akka/actor/Deployer.scala b/akka-actor/src/main/scala/akka/actor/Deployer.scala index 6bbae690b1..2330f34ff7 100644 --- a/akka-actor/src/main/scala/akka/actor/Deployer.scala +++ b/akka-actor/src/main/scala/akka/actor/Deployer.scala @@ -138,12 +138,7 @@ object Deployer extends ActorDeployer { case "least-cpu" ⇒ LeastCPU case "least-ram" ⇒ LeastRAM case "least-messages" ⇒ LeastMessages - case customRouterClassName ⇒ - createInstance[AnyRef](customRouterClassName, emptyParams, emptyArguments).fold( - e ⇒ throw new ConfigurationException( - "Config option [" + addressPath + ".router] needs to be one of " + - "[\"direct\", \"round-robin\", \"random\", \"scatter-gather\", \"least-cpu\", \"least-ram\", \"least-messages\" or the fully qualified name of Router class]", e), - CustomRouter(_)) + case routerClassName ⇒ CustomRouter(routerClassName) } // -------------------------------- diff --git a/akka-actor/src/main/scala/akka/actor/DeploymentConfig.scala b/akka-actor/src/main/scala/akka/actor/DeploymentConfig.scala index 6c9e209cd7..f43a1fd73a 100644 --- a/akka-actor/src/main/scala/akka/actor/DeploymentConfig.scala +++ b/akka-actor/src/main/scala/akka/actor/DeploymentConfig.scala @@ -40,7 +40,7 @@ object DeploymentConfig { // --- Routing // -------------------------------- sealed trait Routing - case class CustomRouter(router: AnyRef) extends Routing + case class CustomRouter(routerClassName: String) extends Routing // For Java API case class Direct() extends Routing @@ -194,21 +194,21 @@ object DeploymentConfig { } def routerTypeFor(routing: Routing): RouterType = routing match { - case Direct ⇒ RouterType.Direct - case Direct() ⇒ RouterType.Direct - case RoundRobin ⇒ RouterType.RoundRobin - case RoundRobin() ⇒ RouterType.RoundRobin - case Random ⇒ RouterType.Random - case Random() ⇒ RouterType.Random - case ScatterGather ⇒ RouterType.ScatterGather - case ScatterGather() ⇒ RouterType.ScatterGather - case LeastCPU ⇒ RouterType.LeastCPU - case LeastCPU() ⇒ RouterType.LeastCPU - case LeastRAM ⇒ RouterType.LeastRAM - case LeastRAM() ⇒ RouterType.LeastRAM - case LeastMessages ⇒ RouterType.LeastMessages - case LeastMessages() ⇒ RouterType.LeastMessages - case c: CustomRouter ⇒ throw new UnsupportedOperationException("Unknown Router [" + c + "]") + case Direct ⇒ RouterType.Direct + case Direct() ⇒ RouterType.Direct + case RoundRobin ⇒ RouterType.RoundRobin + case RoundRobin() ⇒ RouterType.RoundRobin + case Random ⇒ RouterType.Random + case Random() ⇒ RouterType.Random + case ScatterGather ⇒ RouterType.ScatterGather + case ScatterGather() ⇒ RouterType.ScatterGather + case LeastCPU ⇒ RouterType.LeastCPU + case LeastCPU() ⇒ RouterType.LeastCPU + case LeastRAM ⇒ RouterType.LeastRAM + case LeastRAM() ⇒ RouterType.LeastRAM + case LeastMessages ⇒ RouterType.LeastMessages + case LeastMessages() ⇒ RouterType.LeastMessages + case CustomRouter(implClass) ⇒ RouterType.Custom(implClass) } def replicationSchemeFor(deployment: Deploy): Option[ReplicationScheme] = deployment match { diff --git a/akka-actor/src/main/scala/akka/routing/RoutedProps.scala b/akka-actor/src/main/scala/akka/routing/RoutedProps.scala index c6bfa97c3f..6cfedc491a 100644 --- a/akka-actor/src/main/scala/akka/routing/RoutedProps.scala +++ b/akka-actor/src/main/scala/akka/routing/RoutedProps.scala @@ -71,7 +71,7 @@ object RouterType { /** * A user-defined custom RouterType. */ - object Custom extends RouterType + case class Custom(implClass: String) extends RouterType } diff --git a/akka-actor/src/main/scala/akka/routing/Routing.scala b/akka-actor/src/main/scala/akka/routing/Routing.scala index 4e6ece4215..0e085d284f 100644 --- a/akka-actor/src/main/scala/akka/routing/Routing.scala +++ b/akka-actor/src/main/scala/akka/routing/Routing.scala @@ -89,6 +89,24 @@ object Routing { if (clusteringEnabled && !props.localOnly) ReflectiveAccess.ClusterModule.newClusteredActorRef(props) else new RoutedActorRef(props, address) } + + def createCustomRouter(implClass: String): Router = { + ReflectiveAccess.createInstance( + implClass, + Array[Class[_]](), + Array[AnyRef]()) match { + case Right(router) ⇒ router.asInstanceOf[Router] + case Left(exception) ⇒ + val cause = exception match { + case i: InvocationTargetException ⇒ i.getTargetException + case _ ⇒ exception + } + throw new ConfigurationException( + "Could not instantiate custom Router of [" + + implClass + "] due to: " + + cause, cause) + } + } } /** diff --git a/akka-remote/src/main/scala/akka/remote/FailureDetector.scala b/akka-remote/src/main/scala/akka/remote/FailureDetector.scala index 918e4b1ef2..e92590d8ac 100644 --- a/akka-remote/src/main/scala/akka/remote/FailureDetector.scala +++ b/akka-remote/src/main/scala/akka/remote/FailureDetector.scala @@ -58,7 +58,7 @@ object FailureDetector { implClass, Array[Class[_]](), Array[AnyRef]()) match { - case Right(actor) ⇒ actor + case Right(failureDetector) ⇒ failureDetector case Left(exception) ⇒ val cause = exception match { case i: InvocationTargetException ⇒ i.getTargetException diff --git a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala index c10ca60c7a..b7cb36d4cf 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala @@ -91,10 +91,10 @@ class RemoteActorRefProvider extends ActorRefProvider { .format(address, remoteAddresses.mkString(", "))) () ⇒ new ScatterGatherFirstCompletedRouter - case RouterType.LeastCPU ⇒ sys.error("Router LeastCPU not supported yet") - case RouterType.LeastRAM ⇒ sys.error("Router LeastRAM not supported yet") - case RouterType.LeastMessages ⇒ sys.error("Router LeastMessages not supported yet") - case RouterType.Custom ⇒ sys.error("Router Custom not supported yet") + case RouterType.LeastCPU ⇒ sys.error("Router LeastCPU not supported yet") + case RouterType.LeastRAM ⇒ sys.error("Router LeastRAM not supported yet") + case RouterType.LeastMessages ⇒ sys.error("Router LeastMessages not supported yet") + case RouterType.Custom(implClass) ⇒ () ⇒ Routing.createCustomRouter(implClass) } var connections = Map.empty[InetSocketAddress, ActorRef]