* Deprecate all actorFor methods * resolveActorRef in provider * Identify auto receive message * Support ActorPath in actorSelection * Support remote actor selections * Additional tests of actor selection * Update tests (keep most actorFor tests) * Update samples to use actorSelection * Updates to documentation * Migration guide, including motivation
105 lines
3.2 KiB
Scala
105 lines
3.2 KiB
Scala
/**
|
||
* Copyright (C) 2009-2013 Typesafe Inc. <http://www.typesafe.com>
|
||
*/
|
||
package docs.routing
|
||
|
||
import akka.actor.{ Actor, ActorRef, ActorSystem, Props, ActorLogging }
|
||
import akka.routing.ConsistentHashingRouter.ConsistentHashable
|
||
import akka.routing.FromConfig
|
||
import akka.routing.RoundRobinRouter
|
||
import akka.testkit._
|
||
import com.typesafe.config.ConfigFactory
|
||
import scala.concurrent.duration._
|
||
import akka.actor.ActorPath
|
||
|
||
object RouterViaProgramDocSpec {
|
||
case class Message1(nbr: Int)
|
||
case class Reply1(name: String, m: Message1)
|
||
|
||
class ExampleActor1 extends Actor {
|
||
def receive = {
|
||
case m @ Message1(nbr) ⇒ sender ! Reply1(self.path.name, m)
|
||
}
|
||
}
|
||
|
||
class Echo extends Actor {
|
||
def receive = {
|
||
case m ⇒ sender ! m
|
||
}
|
||
}
|
||
}
|
||
|
||
class RouterViaProgramDocSpec extends AkkaSpec with ImplicitSender {
|
||
import RouterViaProgramDocSpec._
|
||
|
||
"demonstrate routees from paths" in {
|
||
|
||
//#programmaticRoutingRouteePaths
|
||
val actor1 = system.actorOf(Props[ExampleActor1], "actor1")
|
||
val actor2 = system.actorOf(Props[ExampleActor1], "actor2")
|
||
val actor3 = system.actorOf(Props[ExampleActor1], "actor3")
|
||
val routees = Vector[String]("/user/actor1", "/user/actor2", "/user/actor3")
|
||
val router = system.actorOf(Props().withRouter(
|
||
RoundRobinRouter(routees = routees)))
|
||
//#programmaticRoutingRouteePaths
|
||
1 to 6 foreach { i ⇒ router ! Message1(i) }
|
||
val received = receiveN(6, 5.seconds.dilated)
|
||
1 to 6 foreach { i ⇒
|
||
val expectedName = (routees((i - 1) % routees.length)).split("/").last
|
||
val expectedMsg = Message1(i)
|
||
received must contain[AnyRef](Reply1(expectedName, expectedMsg))
|
||
}
|
||
}
|
||
|
||
"demonstrate broadcast" in {
|
||
val router = system.actorOf(Props[Echo].withRouter(RoundRobinRouter(nrOfInstances = 5)))
|
||
//#broadcastDavyJonesWarning
|
||
import akka.routing.Broadcast
|
||
router ! Broadcast("Watch out for Davy Jones' locker")
|
||
//#broadcastDavyJonesWarning
|
||
receiveN(5, 5.seconds.dilated) must have length (5)
|
||
}
|
||
|
||
"demonstrate PoisonPill" in {
|
||
val router = system.actorOf(Props[Echo].withRouter(RoundRobinRouter(nrOfInstances = 5)))
|
||
//#poisonPill
|
||
import akka.actor.PoisonPill
|
||
router ! PoisonPill
|
||
//#poisonPill
|
||
expectNoMsg(1.seconds.dilated)
|
||
router.isTerminated must be(true)
|
||
}
|
||
|
||
"demonstrate broadcast of PoisonPill" in {
|
||
val router = system.actorOf(Props[Echo].withRouter(RoundRobinRouter(nrOfInstances = 5)))
|
||
//#broadcastPoisonPill
|
||
import akka.actor.PoisonPill
|
||
import akka.routing.Broadcast
|
||
router ! Broadcast(PoisonPill)
|
||
//#broadcastPoisonPill
|
||
expectNoMsg(1.seconds.dilated)
|
||
router.isTerminated must be(true)
|
||
}
|
||
|
||
"demonstrate Kill" in {
|
||
val router = system.actorOf(Props[Echo].withRouter(RoundRobinRouter(nrOfInstances = 5)))
|
||
//#kill
|
||
import akka.actor.Kill
|
||
router ! Kill
|
||
//#kill
|
||
expectNoMsg(1.seconds.dilated)
|
||
router.isTerminated must be(true)
|
||
}
|
||
|
||
"demonstrate broadcast of Kill" in {
|
||
val router = system.actorOf(Props[Echo].withRouter(RoundRobinRouter(nrOfInstances = 5)))
|
||
//#broadcastKill
|
||
import akka.actor.Kill
|
||
import akka.routing.Broadcast
|
||
router ! Broadcast(Kill)
|
||
//#broadcastKill
|
||
expectNoMsg(1.seconds.dilated)
|
||
router.isTerminated must be(true)
|
||
}
|
||
|
||
}
|