Planning for a repeat participant when starting the Play 2.4.3 system

I recently started working on the Scala and Play Framework and just updated the service I was working on in Play 2.4.3. My ultimate goal is to create a night process that launches a service method in my game application with the goal of scheduling events by calling the method that I am invoking with the Actor.

I had the basic idea of ​​this, working through a Global.scala file with an onStart override, but then I saw documentation that you are disconnecting from using GlobalSettings ( https://www.playframework.com/documentation/2.4.x/GlobalSettings ) and tried to port it to a nested dependency approach.

Here is what I have collected so far:

Module Code:

import javax.inject._

import com.myOrganization.myPackage.Actors.ScheduleActor
import play.api.libs.concurrent.AkkaGuiceSupport
import play.libs.Akka
import play.api.libs.concurrent.Execution.Implicits.defaultContext
import akka.actor.{ActorRef, ActorSystem}
import scala.concurrent.duration._
import play.Application

import com.google.inject.AbstractModule

@Singleton
class NightlyEvalSchedulerStartup @Inject()(system: ActorSystem, @Named("ScheduleActor") scheduleActor: ActorRef) {
  Akka.system.scheduler.schedule(10.seconds, 20.seconds, scheduleActor, "ScheduleActor")
}

class ScheduleModule extends AbstractModule with AkkaGuiceSupport {
  def configure() = {
    bindActor[ScheduleActor]("ScheduleActor")
    bind(classOf[NightlyEvalSchedulerStartup]).asEagerSingleton
  }
}

Actor Class:

import akka.actor.{Actor, Props}
import com.myOrganization.myPackage.services.MySchedulingService

object ScheduleActor {
  def props = Props[ScheduleActor]

  class updateSchedules
}

class ScheduleActor extends Actor {
  val MySchedulingService: MySchedulingService = new MySchedulingService
  def receive = {
    case "runScheduler" => MySchedulingService.nightlyScheduledUpdate()
  }
}

Application.conf

play.modules.enabled += "com.myOrganization.myPackage.modules.ScheduleModule"

, Scala Anorm.

, ( , Http), :

Oops, cannot start the server.
com.google.inject.CreationException: Unable to create injector, see the following errors:

1) Error injecting constructor, java.lang.RuntimeException: There is no started application

, Aka.system.scheduler... println(), , , , , , . , - , Akka, . , , , .

EDIT ( ):

3 . , :

package com.myOrganization.performanceManagement.modules

import com.myOrganization.performanceManagement.Actors.ScheduleActor
import com.myOrganization.performanceManagement.Actors.ScheduleActor.nightlySchedule
import org.joda.time.{Seconds, LocalDate, LocalTime, LocalDateTime}
import play.api.libs.concurrent.AkkaGuiceSupport
import play.api.libs.concurrent.Execution.Implicits.defaultContext
import akka.actor.{ActorRef, ActorSystem}
import scala.concurrent.duration.{FiniteDuration, SECONDS, HOURS }
import org.joda.time._
import com.google.inject.{Inject, Singleton, AbstractModule}
import com.google.inject.name.Named

class ScheduleModule extends AbstractModule with AkkaGuiceSupport {
  override def configure() = {
    bindActor[ScheduleActor]("ScheduleActor")
    bind(classOf[NightlyEvalSchedulerStartup]).asEagerSingleton()
  }
}

@Singleton
class NightlyEvalSchedulerStartup @Inject()(system: ActorSystem, @Named("ScheduleActor") scheduleActor: ActorRef) {
  //Calculate initial delay to 3am the next day.
  val currentTime: DateTime = DateTime.now
  val targetDateTime = currentTime.plusDays(1).withTimeAtStartOfDay()

  //Account for Daylight savings to an extent, not mandatory that it starts at 3am, just after midnight.
  val initialDelaySeconds = targetDateTime.getHourOfDay match {
    case 0 => new Duration(currentTime, targetDateTime.plusHours(3)).getStandardSeconds
    case 1 => new Duration(currentTime, targetDateTime.plusHours(2)).getStandardSeconds
  }

  //Schedule first actor firing to occur at calculated delay and then every 24 hours.
  system.scheduler.schedule(FiniteDuration(initialDelaySeconds, SECONDS), FiniteDuration(24, HOURS), scheduleActor, nightlySchedule)
}

:

package com.myOrganization.performanceManagement.Actors

import akka.actor.{ActorSystem, Actor}
import com.google.inject.Inject
import com.myOrganization.performanceManagement.services.PMEvalSchedulingService

object ScheduleActor {
  case object nightlySchedule
}

class ScheduleActor @Inject() (actorSystem: ActorSystem) extends Actor {
  val pMEvalSchedulingService: PMEvalSchedulingService = new PMEvalSchedulingService
  override def receive: Receive = {
    case nightlySchedule =>
        println("Called the scheduler")
        pMEvalSchedulingService.nightlyScheduledEvaluationsUpdate()
  }
}
+4
1

, NightlyEvalSchedulerStartup() Akka.system..., AkkaSystem , . akk , . , - !

+1

Source: https://habr.com/ru/post/1610883/


All Articles