85 lines
2.2 KiB
Scala
85 lines
2.2 KiB
Scala
/**
|
|
* Copyright (C) 2009-2018 Lightbend Inc. <https://www.lightbend.com>
|
|
*/
|
|
package akka.routing
|
|
|
|
import java.util.concurrent.atomic.AtomicInteger
|
|
import scala.concurrent.Await
|
|
import akka.actor.{ Props, Actor }
|
|
import akka.testkit.{ TestLatch, ImplicitSender, DefaultTimeout, AkkaSpec }
|
|
import akka.pattern.ask
|
|
|
|
object BroadcastSpec {
|
|
class TestActor extends Actor {
|
|
def receive = { case _ ⇒ }
|
|
}
|
|
}
|
|
|
|
class BroadcastSpec extends AkkaSpec with DefaultTimeout with ImplicitSender {
|
|
|
|
"broadcast group" must {
|
|
|
|
"broadcast message using !" in {
|
|
val doneLatch = new TestLatch(2)
|
|
|
|
val counter1 = new AtomicInteger
|
|
val actor1 = system.actorOf(Props(new Actor {
|
|
def receive = {
|
|
case "end" ⇒ doneLatch.countDown()
|
|
case msg: Int ⇒ counter1.addAndGet(msg)
|
|
}
|
|
}))
|
|
|
|
val counter2 = new AtomicInteger
|
|
val actor2 = system.actorOf(Props(new Actor {
|
|
def receive = {
|
|
case "end" ⇒ doneLatch.countDown()
|
|
case msg: Int ⇒ counter2.addAndGet(msg)
|
|
}
|
|
}))
|
|
|
|
val paths = List(actor1, actor2).map(_.path.toString)
|
|
val routedActor = system.actorOf(BroadcastGroup(paths).props())
|
|
routedActor ! 1
|
|
routedActor ! "end"
|
|
|
|
Await.ready(doneLatch, remainingOrDefault)
|
|
|
|
counter1.get should ===(1)
|
|
counter2.get should ===(1)
|
|
}
|
|
|
|
"broadcast message using ?" in {
|
|
val doneLatch = new TestLatch(2)
|
|
|
|
val counter1 = new AtomicInteger
|
|
val actor1 = system.actorOf(Props(new Actor {
|
|
def receive = {
|
|
case "end" ⇒ doneLatch.countDown()
|
|
case msg: Int ⇒
|
|
counter1.addAndGet(msg)
|
|
sender() ! "ack"
|
|
}
|
|
}))
|
|
|
|
val counter2 = new AtomicInteger
|
|
val actor2 = system.actorOf(Props(new Actor {
|
|
def receive = {
|
|
case "end" ⇒ doneLatch.countDown()
|
|
case msg: Int ⇒ counter2.addAndGet(msg)
|
|
}
|
|
}))
|
|
|
|
val paths = List(actor1, actor2).map(_.path.toString)
|
|
val routedActor = system.actorOf(BroadcastGroup(paths).props())
|
|
routedActor ? 1
|
|
routedActor ! "end"
|
|
|
|
Await.ready(doneLatch, remainingOrDefault)
|
|
|
|
counter1.get should ===(1)
|
|
counter2.get should ===(1)
|
|
}
|
|
}
|
|
|
|
}
|