문제

In the older akka version, I can just pass a collection of Actor refs to the router:

case Children(passengers: Iterable[ActorRef]) =>
  val router = context.actorOf(Props().withRouter(BroadcastRouter(passengers)),
    "Passengers")

Since BroadcastRouter is now deprecated, here is how I am considering doing it with Akka 2.3:

case Children(passengers: Iterable[ActorRef]) =>
  val paths = passengers.map { p => p.path.toString }
  val router = context.actorOf(BroadcastGroup(paths).props(), "Passengers")

Is this correct?

P.S.: This example is from the book Akka Concurrency, Section 10.4.

도움이 되었습니까?

해결책

Yap, this indeed works:

case Children(passengers: Iterable[ActorRef]) =>
  val paths = passengers.map { p => p.path.toString }
  val router = context.actorOf(BroadcastGroup(paths).props(), "Passengers")

as witnessed by the test:

package zzz.akka.avionics.tests

import com.typesafe.config.ConfigFactory
import zzz.akka.avionics.{PassengerSupervisor, PassengerProvider}
import akka.actor.{Props, ActorSystem, Actor, ActorRef}
import org.scalatest.{BeforeAndAfterAll, WordSpecLike, Matchers}
import akka.testkit.{TestKit, ImplicitSender}
import zzz.akka.avionics.PassengerSupervisor.{PassengerBroadcaster, GetPassengerBroadcaster}
import scala.concurrent.duration._

/** Test for the passenger supervisor.
 * Created by Andriy Drozdyuk on 16-Apr-14.
 */

object PassengerSupervisorSpec {
  val config = ConfigFactory.parseString(
    """
      zzz.akka.avionics.passengers = [
             [ "Kelly Franqui",   "23", "A" ],
             [ "Tyrone Dotts",    "23", "B" ],
             [ "Malinda Class",   "23", "C" ],
             [ "Kenya Jolicoeur", "24", "A" ],
             [ "Christian Piche", "24", "B" ]
         ]
    """.stripMargin)

}

// We won't work with "real" passengers. This mock
// passenger will be much easier to verify things with
trait TestPassengerProvider extends PassengerProvider {
  override def newPassenger(callButton: ActorRef): Actor = {
    new Actor {
      def receive = {
        case m => callButton ! m
      }
    }
  }
}

class PassengerSupervisorSpec extends TestKit(ActorSystem("PassengerSupervisorSpec",
  PassengerSupervisorSpec.config))
with ImplicitSender
with WordSpecLike
with BeforeAndAfterAll
with Matchers {
  // Clean up the system when all the tests are done
  override def afterAll() {
    system.shutdown()
  }

  "PassengerSupervisor" should {
    "work" in {
      // Get our SUT
      val a = system.actorOf(Props(new PassengerSupervisor(testActor) with TestPassengerProvider))
      // Grab the BroadcastRouter
      a ! GetPassengerBroadcaster
      val broadcaster = expectMsgType[PassengerBroadcaster].broadcaster
      broadcaster ! "Hithere"
      // All 5 passengers should say "Hithere"
      expectMsg("Hithere")
      expectMsg("Hithere")
      expectMsg("Hithere")
      expectMsg("Hithere")
      expectMsg("Hithere")
      // And then nothing else
      expectNoMsg(100.milliseconds)
      // Ensure that the cache works
      a ! GetPassengerBroadcaster
      expectMsg(PassengerBroadcaster(`broadcaster`))
    }
  }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top