java - Akka actorSelection和resolveActorRef之间的区别

标签 java akka actor-model

我使用两种不同的方法来获得相同的结果,但在一种方法中我需要指定回调时间,为什么? 他们服用相同的药物?

    ActorRef resolveActorRef = getContext().getSystem()
                .provider() .resolveActorRef(ActorPath.fromString("akka://RootRemoteActors/user/$a/remote.actors.AA"));

上面的代码无需等待即可检索 Actor Ref 为什么如果我没有得到证明者,我必须指定一个持续时间?

      ActorSelection actorSelection = getContext().getSystem()
            .actorSelection( ActorPath.fromString("akka://RootRemoteActors/user/$a/remote.actors.AA"));



       ActorRef ois = actorSelection.resolveOne( new Timeout(1000, TimeUnit.MILLISECONDS  ))
                .value().get().get();

最佳答案

最明显的区别可能是,如果您在 actor 路径中使用通配符,一个 ActorSelection 可以表示多个 ActorRef。因此,如果您只是在 actorSelection 上调用 .tell 而不是 resolveOne,您就会将消息传递给所有匹配的 actor。

我从未使用过resolveActorRef,但从来源(ActorRefProviderActorSelection)来看,ActorRefProvider使用getChild rootGuardian 来查找您正在寻找的 Actor,因此从您的 Actor 树的顶部向下遍历,直到他最终找到(或找不到)。

ActorSelection 尝试使用询问模式(因此超时)向选择发送一条 Identify 消息,如果收到响应,它将提供 ActorRef从中获得响应。

如果您编写自己的序列化程序,则似乎会使用

resolveActorRef:Akka Docs ,所以如果您只想解析一个 Actor,我会使用 ActorSelection (顺便说一句,您不必解析它即可向它发送消息)。

关于java - Akka actorSelection和resolveActorRef之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44757323/

相关文章:

java - Spring TransactionTemplate 和提交

scala - 不同的 Scala Actor 实现概述

mongodb - 动态域模型属性未加载

scala - 在 Akka Typed persistent actor 中创建子 actor

erlang - 角色模型和碰撞检测

java - GWT 生成器获取编译时间

从 request.getInputStream() 读取字符时出现 java.io.IOException : Stream closed or Underlying input stream returned zero bytes,

python - Python 中的 "Actor model"和 "Reactor pattern"有什么区别?

java - MainActivity 和 BaseActivity 有什么区别?