【问题标题】:When I must stop my actors?我什么时候必须停止我的演员?
【发布时间】:2013-06-22 11:31:19
【问题描述】:

我在 Play 2 的控制器中启动我的演员。我在某处读到我必须停止我的演员。当我按照下面的示例停止它时,我遇到了文件根本不上传的问题。当我发表评论时,它开始上传。

    //Akka 
    ActorSystem system = Akka.system();
    ActorRef uploader = system.actorOf(new Props(UploaderActor.class), "uploader");
    uploader.tell(new Uploader(post.id, "/public/images/post/",post, request()), uploader);
    //system.stop(uploader);

请帮忙。

我的问题是:什么时候必须停止我的 Actor?

另外一个问题:

我怎样才能在另一个控制器中访问这个actor(获取这个引用)?

【问题讨论】:

    标签: java playframework-2.0 akka playframework-2.1


    【解决方案1】:

    我建议创建一个长期存在的上传器,您可以将上传消息发送到该上传器,它可以在内部创建新的 Actor 来处理实际的上传并在需要时将其关闭。这使客户(您)从管理生命周期中解放出来。

    【讨论】:

      【解决方案2】:

      如果这个actor是短暂的并且只处理一个请求,那么你可以让这个actor在receive方法中停止它自己,如下所示:

      getContext().stop(getSelf());
      

      这样你就可以确定演员在被停止之前已经完成了。对于你的第二个问题,如果你想从其他地方查找这个演员实例,你所需要的只是一个对它正在运行的演员系统的引用。如果你有,那么它只是:

      ActorRef ref = system.actorFor("/user/uploader")
      

      如果您要一次生成多个上传者,请确保为它们命名。您在启动它时给它的名称是您可以用来从其他一些代码中查找它的名称。

      【讨论】:

      • 我必须找到方法来识别演员是否完成了它的工作。但我找不到它
      • 没有。演员异步处理其邮箱。当你向它发送消息时,控制很可能在演员有机会处理消息之前立即返回给调用者。通过让actor从内部停止,您可以确保它在停止之前完成。
      • 你也可以考虑ask而不是tell。这样你就可以得到一个未来的回报,你可以阻止它,直到演员处理完消息。只需确保在完成后回复 Actor 内部的发送者即可。
      • 我这样做。谢谢你。我不明白我可以在里面做什么:)
      猜你喜欢
      • 2014-11-08
      • 2013-10-23
      • 2011-03-18
      • 2012-04-26
      • 1970-01-01
      • 2013-04-30
      • 2021-08-16
      • 1970-01-01
      相关资源
      最近更新 更多