我的任务是通过使用Akka aktors来模拟网络节点之间的交互。目标模型包含节点,每个节点都向其他节点发送和接收消息。
因此,在参与者方法中,每个参与者在开始之前都必须获得所有其他参与者的引用,并向其发送消息。
这似乎是通过构造器参数传递这个参考的简单方法:
val node1 = context.spawn(Node(), "node1")
val node2 = context.spawn(Node(node1), "node2")问题是node1没有在构造函数中获得node2上的ActorRef。如果在创建"node1“后有方法更新参与者"node2",那么问题就不会出现。但是,据我所知,更新演员不是由Akka提供的。
我发现的其他(工作)方式是使用特殊的执行信息:
一开始,家长演员会生孩子:
case class Refs(Set[ActorRef[Node]])
val node1 = context.spawn(Node(), "node1")
val node2 = context.spawn(Node(), "node2")第二,它向它们发送消息,其中包含对每个创建的子参与者的参考信息集。
val refs = Inialise(Set(node1, node2))
context.children.foreach(child => child ! refs)只有在收到Inialise消息后,每个孩子才开始发送和接收任何消息。
有其他方法(模式)来实现这个任务吗?在https://doc.akka.io/docs/akka/current/typed/interaction-patterns.html#scheduling-messages-to-self 交互模式中,我也没有发现任何变体。
我查看了EventBus和preStart生命周期方法,但我不确定。
发布于 2022-02-20 13:03:57
如果您想要实现一个定义的拓扑结构,那么在设置了所有参与者之后发送Initialise消息很可能是实现这一目标的最清晰的方式。
另一种方法是允许连接节点的节点集具有更大的动态性,其中包含一个AddLink (或其他什么)消息,当一个节点以链接到现有节点的链接启动时发送该消息:
val node1 = context.spawn(Node(), "node1")
val node2 = context.spawn(Node(node1), "node2")当node2启动时,它会向node1发送一条AddLink(context.self)消息,因为它了解node1。
另一种选择可能是创建一个节点参与者,要求引用一个可以回答“我应该与谁互连”的问题的参与者?(这个演员可以是ActorSystem的父参与者,甚至是监护人,但是即使在那里,显式地传递一个ActorRef (而不是依赖于context.parent或context.system:这些都需要unsafeUpcast)可能更好)。在启动时,您的节点询问该参与者,该参与者跟踪挂起的请求、所需的拓扑,以及哪些参与者进行了询问(从而注册了自己),以便一旦将请求者链接到存在的所有节点后,它都会回复。
https://stackoverflow.com/questions/71192808
复制相似问题