Something
我的应用程序通过无状态控制器上的 API 调用获得了一个新实例。在我完成了我的关键任务(比如将其保存到我的 Postgres 数据库并提交事务)之后,我现在想做一堆即发即弃的操作。
在我的控制器中,我将模型实例发送到后处理器:
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
演员长这样:
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)
}
}
}
}
所以,这是我不确定的:
我知道根据此页面上的警告不鼓励 Actor 工厂。我对此的补救措施是使用 提供的唯一字符串命名每个演员实例UUID
,以绕过 your-actor-is-not-unique 错误:
play.core.ActionInvoker$$anonfun$receive$1$$anon$1:
Execution exception [[InvalidActorNameException:
actor name somethingActor is not unique!]]
有没有更好的方法来完成上述操作,即而不是给所有东西一个唯一的名称?我遇到的 Akka 文档中的所有示例都给演员一个静态名称,这有点误导。
(也欢迎任何其他评论,例如我使用的捆绑模式是否不受欢迎等)