如何使用参数化参与者在akka中创建路由器?

2023-12-27

我正在尝试在 Scala 中使用广播路由器,如果我没有记错的话,它应该如下所示:

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

这就是我的理解我正在关注的教程 http://doc.akka.io/docs/akka/2.0.2/intro/getting-started-first-scala.html.

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

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

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

请注意,每个演员都应该有一个单独的定义,而且它们都是不同的。我无法在构造函数接收常量的相关问题中使用该解决方案:在 Akka Java actor 模型中,路由器可以使用非默认构造函数创建 actor 吗? https://stackoverflow.com/questions/12889490/in-akka-java-actor-model-can-a-router-create-actors-with-non-default-constructo

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

一个可能的解决方案是使用参与者作为路由器,以分离创建(构造函数)和路由,如所讨论的Akka (java),向所有孩子进行非阻塞广播 https://stackoverflow.com/questions/15721741/akka-java-non-blocking-broadcast-to-all-children.

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

谢谢。


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

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

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 http://doc.akka.io/docs/akka/2.2.0/scala/routing.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用参数化参与者在akka中创建路由器? 的相关文章

  • Spark:用列的平均值替换数据框中的空值

    如何创建 UDF 以编程方式将每列中 Spark 数据框中的空值替换为列平均值 例如 在示例中 数据 col1 空值的值为 2 4 6 8 5 5 5 示例数据 col1 col2 col3 2 null 3 4 3 3 6 5 null
  • 如何在Dotty中使用given?

    我在看Dotty下的文档Contextual Abstractions页面 我看到了Given Instances 给定实例 或者简单地 给定 定义了 规范 值 用于合成给定子句的参数的某些类型 例子 trait Ord T def com
  • IntelliJ IDEA Scala 插件问题

    我对新的 Intellij IDEA 10 和 Scala 插件有疑问 当我在 Scala 源文件中输入任何内容时 编辑器会永久冻结 在其他文件 java 和其他 编辑器中效果很好 结构视图 scala 检查和显示成员功能已关闭 堆大小增加
  • Scala:在运行时获取 mixin 接口

    我需要在运行时从给定的类获取所有接口 全部加载在类加载器中 例如 如果一个类是这样声明的 trait B trait C trait D class A extends B with C with D 我想在运行时获取这些信息 A 取决于
  • Ruby on Rails - 向所有路由添加 ID 参数

    我想知道在 Rails 路由中实现以下功能的最佳方法是什么 场景 一个网站 用户注册账户 gt accountID 账户 成为网站内的主要实体 例子 https basecamp com ID https basecamp com ID 将
  • 如何使用 apply/unapply 方法重现案例类行为?

    我尝试用普通类和伴生对象替换案例类 但突然出现类型错误 编译良好的代码 综合示例 trait Elem A B def C other Elem C A Elem C B other match case Chain head tail g
  • Java / Scala Future 由回调驱动

    简洁版本 我怎样才能创建一个Promise
  • 使用 ioctl 在 C++ 中以编程方式添加路由

    我编写了简单的 C 函数 添加了新路线 void addRoute int fd socket PF INET SOCK DGRAM IPPROTO IP struct rtentry route memset route 0 sizeof
  • 了解 Scala 中的中缀方法调用和缺点运算符(::)

    我对 Scala 编程语言相当陌生 当我遵循以下网站的讲义时 我正在尝试一些萦绕在我脑海中的东西 here http horstmann com sjsu cs152 04 closures1 html 我想我无法真正理解 cons 运算符
  • Scala 中值类的隐式 Json 格式化程序

    我有许多值类组成了一个更大的对象案例类 final case class TopLevel foo Foo bar Bar final case class Foo foo String extends AnyVal final case
  • 需要在 :id 中包含可能的句点的 Rails 路线,但也保留可选的 :format

    我有一个 Rails 路线 将股票代码作为 id feeds AMZN将返回亚马逊页面 feeds AMZN csv将返回相同数据的 CSV 表示形式 但我还需要容纳像 VIA B 维亚康姆 这样的股票 以便这两条路线都有效 feeds V
  • 使用 Akka 玩 2.5 - 找不到参数超时的隐式值:akka.util.Timeout

    我正在尝试使用 Play 2 5 测试 Akka 但遇到了一个似乎无法解决的编译错误 我正在关注 Play 文档中的此页面 https playframework com documentation 2 5 x ScalaAkka http
  • 框架时代的封装

    在我以前的 C 工作中 我们总是非常小心地封装成员变量 并且仅在绝对必要时才将它们作为属性公开 我们有非常具体的构造函数来确保您在使用对象之前完全构造了该对象 如今 使用 ORM 框架 依赖注入 序列化等 似乎您最好只依赖默认构造函数并在属
  • 使用 Spray-json 解析简单数组

    我正在尝试 但失败了 了解 Spray json 如何将 json feed 转换为对象 如果我有一个简单的 key gt value json feed 那么它似乎可以正常工作 但是我想要读取的数据出现在如下列表中 name John a
  • 如何捕获 Oozie Spark 输出

    有没有办法捕获spark的输出然后将其输入到shell上 我们当前正在使用 scala 创建 jar 文件 并希望我们的 Spark 输出成为 shell 输入 我的想法是使用 wf actionData spark XXXX var 我只
  • 显式移动向量是否可以消除隐式复制向量?

    我在接受的答案中读到here https stackoverflow com questions 4782757 rule of three becomes rule of five with c11 that a 对于显式声明移动构造函数
  • 错误:协变类型 A 出现在逆变位置

    我试图写一个不可变的Matrix A 班级 我希望该类是协变的A但是当我把 在 前面A编译器开始抱怨类中的某些操作 以下是我的相关子集Matrix类 实际类比以下子集大 5 倍左右 class Matrix A private val co
  • Scala Tuple2Zipped 与 IterableLike zip

    两种实现有什么区别 这个比那个好吗 有一篇博客文章说 Tuple2Zipped 性能更好 但没有提供原因 并且查看源代码我没有看到差异 val l1 List 1 2 3 val l2 List 5 6 7 val v1 l1 zip l2
  • Scala 模式匹配变量绑定

    为什么提取器返回时不能以 样式绑定变量Option
  • 类型级编程有哪些示例? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我不明白 类型级编程 是什么意思 也无法使用Google找到合适的解释 有人可以提供一个演示类型级编程的示例吗 范式的解释和 或定义将

随机推荐