13

In Spiel 2.0.x doc können Sie sehen, wie asynchrone Aufgaben planen:Spiel Rahmen 2.1 - Aufgaben Scheduling async

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

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

Wie kann man das Gleiche erreichen withthe kürzlich Spielen 2.1 releades? ??

Die ganze akka API scheint sich geändert zu haben ...

ich eingecheckt haben:

https://github.com/playframework/Play20/wiki/Highlights https://github.com/playframework/Play20/wiki/Migration und auch http://doc.akka.io/docs/akka/2.1.0-RC1/project/migration-guide-2.0.x-2.1.x.html

fragte auch hier: https://groups.google.com/d/topic/play-framework/7VcwNea6QlM/discussion

Antwort

20

Mit sample code und Akka API Ich habe einen Schnelltest gemacht, funktioniert für mich.

Vergleich Code zwischen 2.0.4 und 2.1RC1 Ich kann es nur zwei Änderungen bei Scheduler sehen sind:

  1. ersetzt Import

    // import akka.util.duration._ 
    import scala.concurrent.duration._ 
    
  2. hinzugefügt Import:

    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.")) 
    } 

} 

bearbeiten

Nota bene, wie ich von Julien Beitrag auf der Gruppe sehen kann, ist das genug defaultContext nur zu importieren:

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

biesior's answer groß ist

Sie haben jedoch nicht zu g o durch einen Schauspieler, wenn Sie nicht wollen. Hier ist die gleiche Antwort mit gutem alten 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") 
    } 
}) 
2

Zum Beispiel eine Aufgabe läuft jeden Samstag um 15 Uhr in 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() 
);