【发布时间】:2016-01-20 05:29:44
【问题描述】:
我想做的是发送一堆电子邮件,其中的内容会针对每个用户(他们的姓名等)稍作更改。
问题是,在等待前一个阻塞后,遍历用户列表并发送每个用户列表非常慢。
所以我想我会使用 Akka 并行执行。
我用
- 播放 2.4.3
- play-mailer 3.0.1
这是我的演员:
import javax.inject.Inject
import akka.actor._
import play.api.libs.mailer.{MailerClient, Email}
object EmailActor {
def props = Props[EmailActor]
case class SendEmail(email: Email)
}
class EmailActor @Inject()(mailerClient: MailerClient) extends Actor {
import EmailActor._
def receive = {
case SendEmail(email: Email) =>
// send mail
mailerClient.send(email)
sender() ! "Sent"
}
}
我设法将我的演员直接注入我的控制器,但它仍然很慢,我猜它对每条消息使用相同的演员。我想要一群演员来处理我的电子邮件!
这是我的模块
class MyModule extends AbstractModule with AkkaGuiceSupport {
override def configure = {
bindActor[EmailActor]("email-actor")
}
}
这是我的控制器
@Singleton
class Emails @Inject()(system: ActorSystem) extends Controller with InjectedActorSupport {
...
def sendEmailToUsers(event : Event, request:RequestHeader) : Future[Seq[String]] = {
implicit val timeout : akka.util.Timeout = 5.seconds
val results = event.people
.map(user => {
val actor = system.actorOf(EmailActor.props, "email-actor")
(actor ? SendEmail(createEmail(event, user, request))).mapTo[String]
})
Future.sequence(results)
}
我得到了异常
IllegalArgumentException: no matching constructor found on class actors.EmailActor for arguments []
我对 Akka 中的 ActorSystem 不使用 Plays 依赖注入并不感到惊讶。那我该怎么办?
问题
我如何(使用 Play 中的最佳实践)并行发送电子邮件?
【问题讨论】:
标签: scala playframework akka playframework-2.4