Added support for custom user-defined routers
This commit is contained in:
parent
e779690aa1
commit
d31057dacf
7 changed files with 49 additions and 36 deletions
|
|
@ -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] =
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
||||
// --------------------------------
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ object RouterType {
|
|||
/**
|
||||
* A user-defined custom RouterType.
|
||||
*/
|
||||
object Custom extends RouterType
|
||||
case class Custom(implClass: String) extends RouterType
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue