Added support for custom user-defined routers

This commit is contained in:
Jonas Bonér 2011-10-11 11:18:47 +02:00
parent e779690aa1
commit d31057dacf
7 changed files with 49 additions and 36 deletions

View file

@ -165,7 +165,7 @@ class LocalActorRefProvider extends ActorRefProvider {
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.Custom(implClass) () Routing.createCustomRouter(implClass)
}
val connections: Iterable[ActorRef] =

View file

@ -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)
}
// --------------------------------

View file

@ -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
@ -208,7 +208,7 @@ object DeploymentConfig {
case LeastRAM() RouterType.LeastRAM
case LeastMessages RouterType.LeastMessages
case LeastMessages() RouterType.LeastMessages
case c: CustomRouter throw new UnsupportedOperationException("Unknown Router [" + c + "]")
case CustomRouter(implClass) RouterType.Custom(implClass)
}
def replicationSchemeFor(deployment: Deploy): Option[ReplicationScheme] = deployment match {

View file

@ -71,7 +71,7 @@ object RouterType {
/**
* A user-defined custom RouterType.
*/
object Custom extends RouterType
case class Custom(implClass: String) extends RouterType
}

View file

@ -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)
}
}
}
/**

View file

@ -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

View file

@ -94,7 +94,7 @@ class RemoteActorRefProvider extends ActorRefProvider {
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.Custom(implClass) () Routing.createCustomRouter(implClass)
}
var connections = Map.empty[InetSocketAddress, ActorRef]