3

I'm currently developing an application using Play-Scala framework and akka actor to send email when a CRUD action with database happen. I have a problem when restart server.

Any way to reload akka scheduler when Play framework restart or persist akka scheduler and when restart app it will run scheduler. This is my code for example.

@Singleton
class SendEmailSaveDraftActor @Inject()(system: ActorSystem,
                                        config: Configuration,
                                        mailService: MailService)(implicit exec: ExecutionContext) extends Actor {

  val userSchedules: mutable.HashMap[String, Seq[Cancellable]] = mutable.HashMap()
  private val emailAdmin = config.getString("email.admin").getOrElse("")
  private val interval24Hours = config.getInt("batch.saveDarf24.extractIntervalHours").getOrElse(1)
  private val interval72Hours = config.getInt("batch.saveDarf72.extractIntervalHours").getOrElse(1)
  private val interval14Days = config.getInt("batch.saveDarf14.extractIntervalDays").getOrElse(1)

  def receive = {
    case s: SendEmailSaveDrafModel =>
      userSchedules.get(s.userName) match {
        case Some(schedules) =>
          schedules.map(_.cancel())
          userSchedules.update(s.userName, getSchedules(s))
        case None =>
          userSchedules += (s.userName -> getSchedules(s))
      }
    case userName: String =>
      userSchedules.get(userName) match {
        case Some(schedules) =>
          schedules.map(_.cancel())
        case None =>
      }
  }

  def getSchedules(s: SendEmailSaveDrafModel): Seq[Cancellable] = {
    val schedule1 = system.scheduler.scheduleOnce(5 minutes) {
      mailService Send EmailSaveDraft24Hours(to = Seq(s.to), bccEmails = Seq(emailAdmin),id = s.id, orderNo = s.orderNo,designId = s.designId)
    }
    val schedule2 = system.scheduler.scheduleOnce(10 minutes) {
      mailService Send EmailSaveDraft72Hours(to = Seq(s.to), bccEmails = Seq(emailAdmin),id = s.id, orderNo = s.orderNo,designId = s.designId)
    }
    val schedule3 = system.scheduler.scheduleOnce(15 minutes) {
      mailService Send EmailSaveDraft14Days(to = Seq(s.to), bccEmails = Seq(emailAdmin),id = s.id, orderNo = s.orderNo,designId = s.designId)
    }
    Seq(schedule1, schedule2, schedule3)
  }
}
viennv1709
  • 43
  • 3

1 Answers1

0

I am using akka scheduler as shown in below code.

Each user can login to my Application and can create scheduler for background task.I am using Akka scheduler for this purpose.

public Cancellable buildScheduler(String actorName, SchedulerActorMessage message, long interval, TimeUnit timeUnit, long initialDelay, String actorMapKey) {

ActorRef daemonRef = actorSystem.actorOf(Props.create(SchedulerActor.class), actorName);
Cancellable cancellableActor = actorSystem.scheduler().schedule(FiniteDuration.apply(initialDelay, timeUnit),
        FiniteDuration.apply(interval, timeUnit), daemonRef, message,
        actorSystem.dispatcher(), ActorRef.noSender());
actorMap.put(actorMapKey, cancellableActor);
return cancellableActor;

}

I am storing the necessary information in the DB and when application start, I am staring the scheduler again in the global class.