Scala Akka:如何更新"奴隶"演员

时间:2016-05-06 13:02:31

标签: scala akka

我是Akka和演员的新手,正在玩它。为此,我使用一个带有几个子actor的父Actor,它是从带有平衡池的路由器创建的。每个actor都会保存一些我想要从父actor更新的数据(所有这些)。所以我做了类似的事情     路由器!广播(MessengeToAll(Somedata))

令我惊讶的是,在平衡池设置中,并未更新所有子actor的状态。我试图发送一条打印消息,发现我是如此愚蠢,当然没有必要全部都会更新,因为看起来路由器只是向邮箱发送消息,而我正在使用平衡池,只有最空闲的演员将"窃取"更新消息。

这可以通过使用RoundRobin路由器来解决,但是,我仍然想要使用Balancing池。我也不想要一个广播池。我在Scala文档中发现了一些关于事件总线的东西,但它非常复杂,我不明白如何真正做到这一点。有人可以用(可能)简单的解决方案帮助我吗?非常感谢。 :)

1 个答案:

答案 0 :(得分:1)

如果要向给定actor的所有子actor发送广播,BalancingPool路由器肯定不是你想要的,也不是RoundRobin路由器。

阅读this link中的“池与群组”部分。无视它是一个.NET doc;其内容与平台无关

如果使用路由池,则不保留对路由池创建的actor的引用。因此,除非您想做一些魔术来找出actor路径名,否则只能使用该路由池的路由逻辑向它们发送消息。

您想要的是自己创建演员,然后在创建路由组时将其作为路由提供。然后你可以直接和通过路由器解决它们。

如果您想向他们发送所有消息,您可以myActors foreach (_ ! "message"),如果您想通过路由器,可以router ! "message"

我担心没有“BalancingPool”路由器组等效;我将使用RoundRobin路由逻辑给出一个完整的示例:

import akka.actor.{Actor, ActorSystem, Props}
import akka.routing.{ActorRefRoutee, RoundRobinRoutingLogic, Router}

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future

class ParentActor extends Actor {
  val actors = (1 to 5).map(i => context.system.actorOf(Props[ChildActor], "child" + i))
  val routees = actors map ActorRefRoutee

  val router = Router(RoundRobinRoutingLogic(), routees)

  router.route("hello", sender())
  router.route("hello", sender())
  router.route("hello", sender())
  router.route("hello", sender())
  router.route("hello", sender())

  actors foreach (_ ! "broadcast")

  def receive = { case _ => }
}

class ChildActor extends Actor {
  def receive = {
    case "hello" => println(s"${self.path.name} answers hey")
    case "broadcast" => println(s"${self.path.name} received broadcast")
  }
}

object Main extends App {
  val system = ActorSystem("HelloSystem")

  val parent = system.actorOf(Props(classOf[ParentActor]))

  Future {
    Thread.sleep(5000)
    system.terminate()
  }
}

sbt run

时的输出
[info] Running Main
child2 answers hey
child5 answers hey
child1 answers hey
child4 answers hey
child1 received broadcast
child3 answers hey
child4 received broadcast
child3 received broadcast
child5 received broadcast
child2 received broadcast
[success] Total time: 8 s, completed 7/05/2016 6:28:18 PM
>

祝学习Akka好运!