|
Akka/Scala example source code file (ConfiguredLocalRoutingSpec.scala)
The ConfiguredLocalRoutingSpec.scala Akka example source code
/**
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.routing
import language.postfixOps
import scala.concurrent.Await
import scala.concurrent.duration._
import scala.collection.immutable
import akka.ConfigurationException
import akka.actor.{ Props, Deploy, Actor, ActorRef }
import akka.actor.UnstartedCell
import akka.testkit.{ ImplicitSender, DefaultTimeout, AkkaSpec }
import akka.pattern.gracefulStop
import com.typesafe.config.Config
import akka.actor.ActorSystem
object ConfiguredLocalRoutingSpec {
val config = """
akka {
actor {
default-dispatcher {
executor = "thread-pool-executor"
thread-pool-executor {
core-pool-size-min = 8
core-pool-size-max = 16
}
}
deployment {
/config {
router = random-pool
nr-of-instances = 4
pool-dispatcher {
fork-join-executor.parallelism-min = 4
fork-join-executor.parallelism-max = 4
}
}
/paths {
router = random-group
routees.paths = ["/user/service1", "/user/service2"]
}
/weird {
router = round-robin-pool
nr-of-instances = 3
}
"/weird/*" {
router = round-robin-pool
nr-of-instances = 2
}
/myrouter {
router = "akka.routing.ConfiguredLocalRoutingSpec$MyRouter"
foo = bar
}
}
}
}
"""
class MyRouter(config: Config) extends CustomRouterConfig {
override def createRouter(system: ActorSystem): Router = Router(MyRoutingLogic(config))
}
final case class MyRoutingLogic(config: Config) extends RoutingLogic {
override def select(message: Any, routees: immutable.IndexedSeq[Routee]): Routee =
MyRoutee(config.getString(message.toString))
}
final case class MyRoutee(reply: String) extends Routee {
override def send(message: Any, sender: ActorRef): Unit =
sender ! reply
}
class EchoProps extends Actor {
def receive = {
case "get" ⇒ sender() ! context.props
}
}
class SendRefAtStartup(testActor: ActorRef) extends Actor {
testActor ! self
def receive = { case _ ⇒ }
}
}
@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner])
class ConfiguredLocalRoutingSpec extends AkkaSpec(ConfiguredLocalRoutingSpec.config) with DefaultTimeout with ImplicitSender {
import ConfiguredLocalRoutingSpec._
def routerConfig(ref: ActorRef): akka.routing.RouterConfig = ref match {
case r: RoutedActorRef ⇒
r.underlying match {
case c: RoutedActorCell ⇒ c.routerConfig
case _: UnstartedCell ⇒ awaitCond(r.isStarted, 1 second, 10 millis); routerConfig(ref)
}
}
"RouterConfig" must {
"be picked up from Props" in {
val actor = system.actorOf(RoundRobinPool(12).props(routeeProps = Props[EchoProps]), "someOther")
routerConfig(actor) should be(RoundRobinPool(12))
Await.result(gracefulStop(actor, 3 seconds), 3 seconds)
}
"be overridable in config" in {
val actor = system.actorOf(RoundRobinPool(12).props(routeeProps = Props[EchoProps]), "config")
routerConfig(actor) should be(RandomPool(nrOfInstances = 4, usePoolDispatcher = true))
Await.result(gracefulStop(actor, 3 seconds), 3 seconds)
}
"use routees.paths from config" in {
val actor = system.actorOf(RandomPool(12).props(routeeProps = Props[EchoProps]), "paths")
routerConfig(actor) should be(RandomGroup(List("/user/service1", "/user/service2")))
Await.result(gracefulStop(actor, 3 seconds), 3 seconds)
}
"be overridable in explicit deployment" in {
val actor = system.actorOf(FromConfig.props(routeeProps = Props[EchoProps]).
withDeploy(Deploy(routerConfig = RoundRobinPool(12))), "someOther")
routerConfig(actor) should be(RoundRobinPool(12))
Await.result(gracefulStop(actor, 3 seconds), 3 seconds)
}
"be overridable in config even with explicit deployment" in {
val actor = system.actorOf(FromConfig.props(routeeProps = Props[EchoProps]).
withDeploy(Deploy(routerConfig = RoundRobinPool(12))), "config")
routerConfig(actor) should be(RandomPool(nrOfInstances = 4, usePoolDispatcher = true))
Await.result(gracefulStop(actor, 3 seconds), 3 seconds)
}
"fail with an exception if not correct" in {
intercept[ConfigurationException] {
system.actorOf(FromConfig.props())
}
}
"not get confused when trying to wildcard-configure children" in {
val router = system.actorOf(FromConfig.props(routeeProps = Props(classOf[SendRefAtStartup], testActor)), "weird")
val recv = Set() ++ (for (_ ← 1 to 3) yield expectMsgType[ActorRef])
val expc = Set('a', 'b', 'c') map (i ⇒ system.actorFor("/user/weird/$" + i))
recv should be(expc)
expectNoMsg(1 second)
}
"support custom router" in {
val myrouter = system.actorOf(FromConfig.props(), "myrouter")
myrouter ! "foo"
expectMsg("bar")
}
}
}
Other Akka source code examplesHere is a short list of links related to this Akka ConfiguredLocalRoutingSpec.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.