Java 8 使用Akka actorFor执行演员查找
我有以下Akka演员:Java 8 使用Akka actorFor执行演员查找,java-8,akka,Java 8,Akka,我有以下Akka演员: public class MyActor extends AbstractActor { protected Logger log = LoggerFactory.getLogger(this.getClass()); @Override public Receive createReceive() { return receiveBuilder() .matchAny(message -> {
public class MyActor extends AbstractActor {
protected Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public Receive createReceive() {
return receiveBuilder()
.matchAny(message -> {
String myFullName = self().path().toString();
String myName = self().path().name();
ActorRef reincarnatedMe = context().actorFor(self().path().name());
String reincarnatedFullName = reincarnatedMe.path().toString();
String reincarnatedName = reincarnatedMe.path().name();
log.info("myFullName: {}", myFullName);
log.info("myName: {}", myName);
log.info("reincarnatedFullName: {}", reincarnatedFullName);
log.info("reincarnatedName: {}", reincarnatedName);
}).build();
}
}
在运行时,它生成以下输出:
05:43:14.617 [MySystem-akka.actor.default-dispatcher-4] INFO myapp.actors.MyActor - myFullName: akka://MySystem/user/MyActor
05:43:14.623 [MySystem-akka.actor.default-dispatcher-4] INFO myapp.actors.MyActor - myName: MyActor
05:43:14.623 [MySystem-akka.actor.default-dispatcher-4] INFO myapp.actors.MyActor - reincarnatedFullName: akka://MySystem/user/MyActor/MyActor
05:43:14.623 [MySystem-akka.actor.default-dispatcher-4] INFO myapp.actors.MyActor - reincarnatedName: MyActor
我的理解是,context()
然而,在我上面的代码中,self()
似乎成为了转世我的父母,正如myFullName
仅仅是“MySystem/user/MyActor
”,而转世fullname
是“MySystem/user/MyActor/MyActor
”
我读对了吗?如果是这样,我如何调用(…)
(或任何其他相关方法)的context().actorf,使myFullName
与reinnativefullname
相同(以便self()
和转世我
指的是同一个演员?如果我读得不对,为什么我的全名
与转世全名
不同
更新:
首先,ActorContext.actorFor(String)
被弃用,取而代之的是ActorContext.actorSelection(String)
。此方法返回一个actorSelection,但您仍然可以向actorSelection发送一条消息(例如标识,它会自动响应一条ActorIdentity消息)
actorFor
方法的文档中说,“绝对URI类似于akka://appname/user/actorA 如actorOf(ActorPath)所述进行查找。“我在actorOf(ActorPath)上找不到文档
method,但是另一个actorOf
方法声明它们创建了新的参与者,所以我怀疑这也是一样的。您发现的行为可能是不推荐使用的原因,或者是因为它被不推荐使用,并且使用了其他方法。谢谢@Rob Crawford(+1)请参阅我上面的更新。关于actorSelection(…)
的使用,您可以确认两件事:(1)我可以将任何消息/对象发送到actorSelection
实例,而不仅仅是烘焙在Akka附带的Identification
中,更重要的是,(2)返回的ActorSelection
根据提供的选择路径查找并重用(不创建!)现有的参与者?再次非常感谢!tell()ActorSelection的方法接受一个对象,因此任何消息都可以发送,我从自己使用ActorSelection的过程中知道,如果存在一个参与者,它将重用现有的参与者。如果没有与ActorSelection匹配的参与者,消息将进入死信箱。你太棒了!谢谢Rob!
public class AnotherActor extends AbstractActor { ... }
// Inside MyActor#createReceive:
ActorSelection anotherActorSel = context().actorSelection("AnotherActor");
anotherActorSel.tell(new SomeMessage(), self());