Подтвердить что ты не робот

Play framework 2.1 - планирование асинхронных задач

В игре 2.0.x doc вы можете увидеть, как планировать асинхронные задачи:

http://www.playframework.org/documentation/2.0.4/ScalaAkka

Akka.system.scheduler.schedule(0 seconds, 30 minutes, testActor, "tick")

Как вы можете добиться того же самого, что и в недавнем выпуске Play 2.1???

Весь API akka, похоже, изменился...

Я проверил:

https://github.com/playframework/Play20/wiki/Highlights https://github.com/playframework/Play20/wiki/Migration а также http://doc.akka.io/docs/akka/2.1.0-RC1/project/migration-guide-2.0.x-2.1.x.html

также спросил здесь: https://groups.google.com/d/topic/play-framework/7VcwNea6QlM/discussion

4b9b3361

Ответ 1

Используя образец кода и Akka API, я сделал быстрый тест, работает для меня.

Сравнение кода между 2.0.4 и 2.1RC1. Я вижу, что в случае планировщика есть только два изменения:

  • заменить импорт

    // import akka.util.duration._
    import scala.concurrent.duration._
    
  • добавлен импорт:

    import play.api.libs.concurrent.Execution.Implicits._
    

app/controllers/Application.scala

package controllers

import play.api._
import play.api.mvc._
import play.libs.Akka

import akka.actor._
import scala.concurrent.duration._
import play.api.libs.concurrent.Execution.Implicits._

object Application extends Controller {

  def index = Action {

    // say hello
    Logger.info("hello, index action started")

    val Tick = "tick"
    val Tack = "tack"

    val tickActor = Akka.system.actorOf(Props(new Actor {
      def receive = {
        case Tick => Logger.info("that still ticks!")
        case Tack => Logger.warn("... 7 seconds after start, only once")
      }
    }))

    // Repeat every 5 seconds, start 5 seconds after start
    Akka.system.scheduler.schedule(
      5 seconds,
      5 seconds,
      tickActor,
      Tick
    )

    // do only once, 7 seconds after start
    Akka.system.scheduler.scheduleOnce(7 seconds, tickActor, Tack)

    Ok(views.html.index("Your new application is ready."))
  }

}

Edit

Nota bene, как я вижу из сообщения Жюльена в группе, этого достаточно, чтобы импортировать только defaultContext:

import play.api.libs.concurrent.Execution.Implicits.defaultContext

Ответ 2

Ответ biesior - это великолепно

Однако вам не обязательно проходить актер, если вы этого не хотите. Здесь тот же ответ, используя старый добрый java.lang.Runnable:

Akka.system.scheduler.schedule(5 minutes, 5 minutes, new Runnable {
  def run() {
    Logger.info("that still ticks!")
  }
})
Akka.system.scheduler.scheduleOnce(7 minutes, new Runnable {
  def run() {
    Logger.warn("... 7 seconds after start, only once")
  }
})

Ответ 3

Например, запустите задачу каждую субботу в 15:00 в java:

DateTime now = new DateTime();

DateTime plannedStart = new DateTime()
    .withDayOfWeek(DateTimeConstants.SATURDAY)
    .withHourOfDay(15)
    .withMinuteOfHour(0)
    .withSecondOfMinute(0)
    .withMillisOfSecond(0);

DateTime nextRun = (now.isAfter(plannedStart))
    ? plannedStart.plusDays(7)
    : plannedStart;

Long nextRunInSeconds = (long) secondsBetween(now, nextRun).getSeconds();

Akka.system().scheduler().schedule(
    Duration.create(nextRunInSeconds, TimeUnit.SECONDS),
    Duration.create(7, TimeUnit.DAYS) ,
    new Runnable() {
        public void run() {
            Logger.info("-------------------------scheduler start : " + new DateTime());
        }
    },
    Akka.system().dispatcher()
);