0

我正在尝试理解和使用 akka 持久性。我是这个 EventSourcing 世界的新手。

我试图让一个 ActorRef 列出一些项目,我收到这个“演员名称不是唯一的”错误;所以我正在尝试使用这个 actorSelection 方法。

问题是它要求一个路径。那是哪条路?如果我使用 PlayFramework 的 Akka.system(),如何确保使用正确的路径?

当前代码

def index = Action {
    val queryActor = Akka.system.actorOf(IssuesView.props, IssuesView.actorName)
    val inbox = Inbox.create(Akka.system)
    inbox.send(queryActor, IssuesView.GetAll)
    val issueSet = inbox.receive(1 seconds).asInstanceOf[IssueSet]
    Ok(views.html.index(issueSet.issues.toSeq))
}
4

1 回答 1

1

每个 Actor 在 ActorSystem 中都有一个地址。

ActorPaths 是 Actor 层次结构的表示。顶部是所有名为“user”的用户actor 的监护actor。它的路径类似于akka://<system>/user.

使用创建的演员actorSystem.actorOf将用户监护人作为主管:akka://<system>/user/$1。如果提供了参与者名称,则该名称将用作节点名称。

system.acorOf(props, "Foo")
-> akka://<system>/user/Foo

同一层次结构级别上的所有参与者必须具有唯一的名称。因此,如果您收到错误

演员名字不是唯一的

然后你已经有一个同名的演员在你想开始新的同一关卡上运行。

由另一个 Actor (例如由 Foo )启动的 Actors 启动于context.actorOf(props, "Bar")启动它们的 Actor 的下一级:akka://<system>/Foo/Bar

使用 ActorSelection 时,您传递了一个锚 ref 和一个 relative ActorPath

例如,如果您在Foo其中并想向 的所有子角色发送消息Foo,则可以使用通配符来多播消息:

ActorSelection(self, "./*") ! message

查看akka 文档的这一部分

于 2015-09-28T18:03:17.270 回答