如何在Play Framework 2中从外部向演员发送消息?

时间:2014-09-20 09:57:31

标签: java playframework-2.0 akka actor

我是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'关闭或调整此日志记录。

有人可以帮我吗?为什么第一次使用有效,第二次使用失败?感谢

2 个答案:

答案 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并且不应该使用。