gpt4 book ai didi

scala - 如何使用参数化actor在akka中创建路由器?

转载 作者:行者123 更新时间:2023-12-04 07:54:53 25 4
gpt4 key购买 nike

我正在尝试在 Scala 中使用广播路由器,如果我没记错的话,它应该是这样的:

val system = ActorSystem("My beautiful system")
val workerRouter = system.actorOf(Props[Agent].withRouter(BroadcastRouter(individualDefinitions.size)), name = "agentRouter")

这就是我从 the tutorial I am following 了解到的.

workerRouter 充当另一个参与者,我可以将消息发送到这个路由器,该路由器将把它们发送到所有代理(与我拥有的个人定义一样多)。

问题是我想使用单独的定义来构建代理,它们实际上在构造函数中采用了一些参数,而这些参数在个人定义中。

问:我如何告诉路由器将这些参数作为构造函数的一部分传递给它们中的每一个?

请注意,每个 Actor 都应该有一个单独的定义,它们都是不同的。我无法在构造函数接收常量的相关问题中使用该解决方案: In Akka Java actor model, can a router create actors with non-default constructor?

请注意,这里每个actor 应该有不同的参数,如果其中一个被重新启动,它应该获得与最初获得的参数相同的参数。我不知道是否可以修改该解决方案来做到这一点。

一个可能的解决方案是使用 actor 作为路由器,将创建(构造函数)和路由分开,如问题 Akka (java), non blocking broadcast to all children .

在这种情况下,我不确定这是“正确”的方法。使用 actor 作为路由器有几个问题(除了优雅之外)。我担心充当路由器的角色被重新启动并失去所有订阅者。如果 Actor 在循环的一半中重新启动,如果我没记错的话,一些 Actor 也可能会错过一些消息。

谢谢你。

最佳答案

您可以通过将一些已创建的参与者指定为路由来创建路由器,这些参与者由任何逻辑构造。

下面的示例将创建 2 个以不同方式创建的 actor,然后创建一个循环路由器,它将消息路由到它们。

class MyActor(param1: String) extends Actor with ActorLogging {
def receive: Actor.Receive = {
case msg => log.info("Message from {}: {}", param1, msg)
}
}

object MyActor {
def apply(param: String): Props = Props(new MyActor(param))
}

object Main extends App {
val system = ActorSystem()

val a1 = system.actorOf(MyActor("actor1"))
val a2 = system.actorOf(MyActor("actor2"))

val routerProps = Props.empty.withRouter(RoundRobinRouter(routees = Vector(a1, a2)))

val router = system.actorOf(routerProps)

for (i <- 1 to 10) {
router ! i
}

readLine()
system.shutdown()
}

更多详情: http://doc.akka.io/docs/akka/2.2.0/scala/routing.html

关于scala - 如何使用参数化actor在akka中创建路由器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18339082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com