【发布时间】:2015-07-27 17:52:34
【问题描述】:
我是 Akka 的新手,我正在尝试启动一个 Actor 并从其他各种 Actor 向该 Actor 发送消息。接收者称为英雄,发送者为使者
这是我的英雄课
import akka.actor.UntypedActor;
public class Hero extends UntypedActor {
@Override
public void onReceive(Object arg0) throws Exception {
System.out.println("Received = " + arg0);
}
}
我使用下面的代码启动英雄
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
public class TestHero {
public static void main(String[] args) {
ActorSystem system = ActorSystem.create("testHero");
ActorRef master = system.actorOf(Props.create(Hero.class), "master");
master.tell("I am here", ActorRef.noSender());
}
}
当我运行上面的代码时,我收到消息“已收到 = 我在这里”。
现在我的 Messenger 类的构造函数如下所示
private static ActorRef hero;
public Messenger() {
ActorSelection master = context().actorSelection("akka://localhost/user/serviceA/master");
hero = master.anchor();
}
当我打印英雄对象时,它始终为空。我在这里想念什么?这是搜索演员的正确方法吗?关键是这 2 个参与者将在 2 个不同的 JVM 中运行。
我启用了远程处理并修改了 Messenger 类,如下所示。
import akka.actor.ActorRef;
import akka.actor.ActorSelection;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.actor.UntypedActor;
public class Messenger extends UntypedActor {
private static ActorRef hero;
public Messenger() {
ActorSelection master = context().actorSelection("akka.tcp://testHero@127.0.0.1:2552/user/master");
System.out.println(master);
hero = master.anchor();
}
@Override
public void onReceive(Object arg0) throws Exception {
System.out.println("msg = " + arg0);
}
public static void main(String[] args) {
ActorSystem system = ActorSystem.create("test");
ActorRef actor = system.actorOf(Props.create(Messenger.class), "msgnr");
System.out.println(actor.getClass() + " >> " + actor);
System.out.println(hero);
actor.tell("Hi", hero);
}
}
输出如下
类 akka.actor.RepointableActorRef >> Actor[akka://test/user/msgnr#-975452280]
空
ActorSelection[Anchor(akka://test/deadLetters), Path(/user/master)]
味精 = 嗨
如何等到 Messenger 被创建后才实例化 hero actor ref?
【问题讨论】:
-
您应该阅读 Akka 站点上的远程处理文档。如果您真的想在不同的 JVM 中查找演员,那么您需要启用远程处理,并且您需要提供正确的远程路径:doc.akka.io/docs/akka/2.3.11/java/remoting.html
-
ActorSelection.anchor不是公共 API 的一部分。