Что я хочу сделать, так это разослать кучу электронных писем, в которых содержимое немного изменяется для каждого пользователя (их имя и т. Д.).
Проблема в том, что очень медленно перебирать список пользователей и отправлять каждого из них после ожидания предыдущей блокировки.
Я подумал, что сделаю это параллельно, используя 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 []
Я не удивлен, что ActorSystem
в Akka не использует инъекцию зависимостей Plays. Так что я должен делать?
Вопрос
Как я могу (используя лучшие практики в Google Play) отправлять электронные письма параллельно?