我正在创建一个播放应用程序,它只是我演员周围的http api包装。
我想创建一个发送电子邮件的演员,例如:
我需要帮助理解我应该如何创建儿童演员,谁负责摧毁儿童演员以及如何。
object EmailActorProtocol {
case class Registration(userId: Int)
}
class EmailActor(emailService: EmailService) extends Actor with ActorLogging {
import EmailActorProtocol._
def receive = {
case Registration(userId) => emailService.sendRegistration(userId)
case _ => log.info("catch all")
}
}
现在在我的API层我将:
object EmailApiController extends Controller {
def registration = Action[BodyParsers.parse.json) { request =>
val messageResult = request.body.validate[RegistrationMessage]
messageResult.fold(
errors => { .... }
registrationMsg => {
val emailActor = system.actorOf(Props[new EmailActor(emailService)])
emailActor ! registrationMsg
Ok(Json.toJson(...))
}
)
}
}
所以我需要以下指导(使用上面的骨架结构,就像我到目前为止):
我为每个API调用创建了一个新的EmailActor,我应该怎样去摧毁演员??
创建另一个演员会更有意义吗:system => EmailActorParent => EmailActor?
注意:电子邮件服务很简单,就像MailChimp这样的第三方电子邮件提供商。这将是阻止电话我认为这是重要的。
答案 0 :(得分:1)
我认为结构并不坏,只要它是一个简单的应用程序。在更复杂的环境中,您希望使用并通过电子邮件发送actor manager等。但在这些特殊情况下,我有一个独立的演员处理每个电子邮件发送任务看起来不错(因为调用是阻塞的,你可以隔离这样的功能,然后重新使用你的电子邮件演员可能在另一个项目中)。要关闭actor,您有两个选择:
1)您可以在发送PoisonPill
消息之后向演员发送Registration
消息,如下所示:
val emailActor = system.actorOf(Props[new EmailActor(emailService)])
emailActor ! registrationMsg
emailActor ! PoisonPill // kill the actor after sending the message
Ok(Json.toJson(...))
2)或者你可以让发送电子邮件的演员像这样“自杀”:
def receive = {
case Registration(userId) =>
emailService.sendRegistration(userId)
context.stop(self)
case _ => log.info("catch all")
}
我希望它有所帮助))