我的应用通过无状态控制器上的API调用获取Something
的新实例。在完成我的任务关键任务(比如将其保存到我的Postgres数据库并提交事务)后,我现在想做一堆 fire-and-forget 操作。
在我的控制器中,我将模型实例发送到后处理器:
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)
}
}
}
}
所以,这是我不确定的事情:
我知道根据the warning on this page不鼓励演员工厂。我对此的补救措施是使用UUID
提供的唯一字符串命名每个actor实例,以绕过你的actor-is-not-unique错误:
play.core.ActionInvoker$$anonfun$receive$1$$anon$1:
Execution exception [[InvalidActorNameException:
actor name somethingActor is not unique!]]
有没有更好的方法来实现上述目标,即不是给所有东西一个唯一的名字?我遇到的Akka文档中的所有示例都给actor一个静态名称,这有点误导。
(欢迎任何其他评论,例如,如果我使用的捆绑模式不赞成,等等)
答案 0 :(得分:1)
据我所知,名称参数是可选的。
这可能是也可能不是Akka + Play的情况(尚未检查)。但是,在使用独立actor系统时,通常只在以后需要该引用时命名一个actor。
从它的声音中,你在使用它们之后就抛弃了这些实例,所以你可能会跳过命名步骤。
更好的是,你可以通过在Futures中包装你的操作并使用回调来节省创建每个actor实例的开销:http://doc.akka.io/docs/akka/2.0.3/scala/futures.html