2016-07-26 32 views
6

erreichen kann Ich habe eine Funktion, etwas über einen Timer in einer Schleife zu tun. Also dachte ich an akka scheduler, um das zu erreichen. Hier ist mein Beispielcode (innerhalb eines akka Schauspieler geschrieben):Wie man einen Akka Scheduler innerhalb einer Schleife für die zeitgerechte Ausgabe

class TestActor extends Actor { 

    override def receive: Receive = { 
    case num: Int => println(num) 
    case Tick => loopAndPrint 
    } 

    def loopAndPrint = { 
    val list = List(1, 100, 5, 23) 
    list.map { l => 
     context.system.scheduler.scheduleOnce(Duration.create(30, TimeUnit.SECONDS), self, l) 
    } 
    } 

} 

Ich hatte erwartet, dass die println wird alle 30 Sekunden, bis das Ende der Liste aufgerufen werden. Aber es begann nach 30 Sekunden und endete damit, alle Listenelemente gleichzeitig zu drucken.

Wie kann ich dies erreichen, um die Listenelemente alle 30 Sekunden nach dem Start zu drucken?

Vielen Dank im Voraus.

+0

Sie verwenden 'scheduleOnce' was bedeutet, dass jeder Scheduler nur ausgeführt werden ... einmal. – marcospereira

+0

Und, nur eine Vermutung, aber ich denke, was Sie wirklich wollen, ist 'list.foreach', um jeden Scheduler zu konfigurieren. – marcospereira

+0

@marcospereira ... Ja, ich möchte es einmal planen, und ich möchte zeitnahe Ausgabe, foreach kann das tun – Jet

Antwort

4

Es sieht so aus, als ob Sie den ganzen Integer-Wert durchlaufen und einen Ausdruck für jeden nach 30 Sekunden auf einmal planen. Versuchen Sie, die Dauer für jede Schleife auf 30 zu erhöhen.

class TestActor extends Actor { 

    override def receive: Receive = { 
    case num: Int => println(num) 
    case Tick => loopAndPrint 
    } 

    def loopAndPrint = { 
    val list = List(1, 100, 5, 23) 
    list.foldLeft(30)((t, l)=> { 
     context.system.scheduler.scheduleOnce(Duration.create(t, TimeUnit.SECONDS), self, l) 
     t + 30 
    }) 
    } 

}

+0

@CarlosGaloCampos .... Perfekt! Danke für die Antwort. – Jet