【问题标题】:Akka: finding the actor ref using a pathAkka:使用路径查找演员 ref
【发布时间】: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 的一部分。

标签: java akka


【解决方案1】:

我还通过将 application.conf 文件添加到 Messenger 解决了这个问题。

【讨论】:

    猜你喜欢
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2014-03-09
    • 2019-01-16
    • 2015-03-25
    相关资源
    最近更新 更多