演员层次设计指导,如何以及何时摧毁儿童演员

时间:2015-01-19 17:29:24

标签: scala playframework akka

我正在创建一个播放应用程序,它只是我演员周围的http api包装。

我想创建一个发送电子邮件的演员,例如:

  1. 注册电子邮件
  2. 密码提醒
  3. 我需要帮助理解我应该如何创建儿童演员,谁负责摧毁儿童演员以及如何。

    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(...)) 
             }
           )
        }
    }
    

    所以我需要以下指导(使用上面的骨架结构,就像我到目前为止):

    1. 我为每个API调用创建了一个新的EmailActor,我应该怎样去摧毁演员?

    2. 创建另一个演员会更有意义吗:system => EmailActorParent => EmailActor?

    3. 注意:电子邮件服务很简单,就像MailChimp这样的第三方电子邮件提供商。这将是阻止电话我认为这是重要的。

1 个答案:

答案 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")
}

我希望它有所帮助))