我是Akka的新手并尝试在Java中使用Play Framework 2编写一些代码并使用Akka。 要创建一个actor并向其发送测试消息,我有:
public class Global extends GlobalSettings {
@Override
public void onStart(Application app) {
final ActorRef testActor = Akka.system().actorOf(Props.create(TestActor.class), "testActor");
testActor.tell("hi", ActorRef.noSender());
}
}
这项工作非常好,我看到我的演员收到了我的留言,这是演员的代码:
public class TestActor extends UntypedActor {
@Override
public void onReceive(Object message) throws Exception {
if(message.toString().equals("hi")){
System.out.println("I received a HI");
}else{
unhandled(message);
}
}
}
很简单。 但是,如果我尝试从控制器发送消息:
public static Result index() {
final ActorRef testActor = Akka.system().actorFor("testActor");
testActor.tell("hi", ActorRef.noSender());
return ok(index.render("Your new application is ready."));
}
我在终端上收到此消息:
[INFO] [09/20/2014 11:40:30.850] [application-akka.actor.default-dispatcher-4] [akka:// application / testActor]来自Actor的消息[java.lang.String] [akka:// application / deadLetters]到Actor [akka:// application / testActor]未送达。 [1]遇到死信。可以使用配置设置'akka.log-dead-letters'和'akka.log-dead-letters-during-shutdown'关闭或调整此日志记录。
有人可以帮我吗?为什么第一次使用有效,第二次使用失败?感谢
答案 0 :(得分:2)
actorFor
方法需要整个路径,而您的演员居住在用户空间中,因此您必须使用actorFor("/user/testActor")
。目前您将其发送给application/testActor
,这将是ActorSystem本身的顶级演员。
顺便说一下,actorFor
已被弃用(至少在Scala API中)并被actorSelection
取代。
有关详细信息,请参阅excellent documentation。
答案 1 :(得分:0)
actorFor 应该获得演员的路径,这可能是" akka:// System / user / testActor"。它也不会创建演员,这意味着它应该存在。
无论如何,是否有理由在控制器中使用 actorFor 而不是 actorOf ?它had been deprecated并且不应该使用。