Как я могу перезагрузить планировщик akka при перезапуске фреймворка Play

В настоящее время я разрабатываю приложение с использованием платформы Play-Scala и актера akka для отправки электронной почты, когда происходит действие CRUD с базой данных. У меня проблема при перезапуске сервера.

Любой способ перезагрузить планировщик akka при перезапуске платформы Play или сохранить планировщик akka, и при перезапуске приложения он запустит планировщик. Это мой код, например.

@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)
  }
}

person viennv1709    schedule 24.03.2016    source источник


Ответы (1)


Я использую планировщик akka, как показано в приведенном ниже коде.

Каждый пользователь может войти в мое приложение и создать планировщик для фоновой задачи. Для этой цели я использую планировщик Akka.

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;

}

Я сохраняю необходимую информацию в БД и при запуске приложения снова смотрю планировщик в глобальном классе.

person omee parikh    schedule 09.10.2018