scala - Akka Actor +玩!生成和捆绑 actor 实例的 2.0 Scala 版最佳实践

标签 scala playframework-2.0 akka

我的应用程序通过无状态 Controller 上的 API 调用获得了 Something 的新实例。在完成关键任务之后(例如将其保存到我的 Postgres 数据库并提交事务),我现在想执行一系列即发即弃操作。

在我的 Controller 中,我将模型实例发送到后处理器:

import _root_.com.eaio.uuid.UUID
import akka.actor.Props
// ... skip a bunch of code
play.api.libs.concurrent.Akka.system.actorOf(
    Props[MySomethingPostprocessorActor],
    name = "somethingActor"+new UUID().toString()
) ! something

MySomethingPostprocessorActor actor 如下所示:

class MySomethingPostprocessorActor extends Actor with ActorLogging {

    def receive = {
        case Something(thing, alpha, beta) => try {
                play.api.libs.concurrent.Akka.system.actorOf(
                    Props[MongoActor],
                    name = "mongoActor"+new UUID().toString()
                ) ! Something(thing, alpha, beta)
                play.api.libs.concurrent.Akka.system.actorOf(
                    Props[PubsubActor],
                    name = "pubsubActor"+new UUID().toString()
                ) ! Something(thing, alpha, beta)
                // ... and so forth
        } catch {
            case e => {
                log.error("MySomethingPostprocessorActor error=[{}]", e)
            }
        }
    }
}

所以,这是我不确定的:

我知道根据 the warning on this page 不鼓励 Actor 工厂.我对此的补救措施是用 UUID 提供的唯一字符串命名每个 actor 实例,以绕过 your-actor-is-not-unique 错误:

play.core.ActionInvoker$$anonfun$receive$1$$anon$1:
    Execution exception [[InvalidActorNameException:
        actor name somethingActor is not unique!]]

是否有更好的方法来完成上述操作,即不是为所有内容都指定一个唯一的名称?我遇到的 Akka 文档中的所有示例都为 actors 提供了一个静态名称,这有点误导。

(也欢迎任何其他评论,例如,如果我使用的捆绑模式不受欢迎等)

最佳答案

据我所知,名称参数是可选的。

Akka + Play 可能是这种情况,也可能不是这种情况(尚未检查)。但是,在使用独立的 Actor 系统时,您通常只在以后需要引用时才命名 Actor 。

从它的声音来看,您在使用这些实例后将其丢弃,因此您可以跳过命名步骤。

更好的是,您可以通过将操作包装在 Futures 中并在需要时使用回调来节省创建每个 actor 实例的开销:http://doc.akka.io/docs/akka/2.0.3/scala/futures.html

关于scala - Akka Actor +玩!生成和捆绑 actor 实例的 2.0 Scala 版最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12069503/

相关文章:

scala - 玩! framework 2.0 scala - ClassCastException : models. MyModel 无法转换为 models.MyModel

java - 如何在剧中显示 SPARQL 查询的输出!看法?

javascript - Play 2.x : How to use two jsRoutes files in one scala template

akka - 提高 Akka 远程吞吐量

scala - 如何使用带有 SSL 证书的 Akka 发送 HTTP 请求

scala - 在 Scala 中将 List[Short] 转换为 Array[Byte] 的最佳方法是什么?

scala - 存在类型或类型参数绑定(bind)失败

scala - 如何使用 Numeric[T] 表示任何数字类型的零

java - Typesafe Activator : "run" works, 但 "start"失败并出现错误

java - 如何将基于 Actor 的源与 Akka Graph 结合使用?