2016-07-26 76 views
6

Mam funkcjonalność do zrobienia czegoś przez timer wewnątrz pętli. Więc pomyślałem o użyciu programu planującego akka, aby to osiągnąć. Oto mój przykładowy kod (napisany wewnątrz aktora Akka):Jak uzyskać terminarz akka wewnątrz pętli dla aktualnego ouput

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

} 

Spodziewałem się, że println zostanie wywołana co 30 sekund do końca listy. Zaczęło się jednak po 30 sekundach i kończyło się drukowaniem wszystkich pozycji listy na raz.

Jak mogę to osiągnąć, aby wydrukować elementy listy co 30 sekund po starcie?

Z góry dziękuję.

+0

Używasz 'scheduleOnce' co oznacza, że ​​każdy harmonogram będzie działać tylko ... raz. – marcospereira

+0

I, tylko zgadnij, ale myślę, że naprawdę chcesz 'list.foreach' skonfigurować każdy program planujący. – marcospereira

+0

@marcospereira ... Tak, chcę zaplanować go raz, a chcę mieć aktualne wyniki, foreach nie mogę tego zrobić – Jet

Odpowiedz

4

Wygląda na to, że zapętlisz całą wartość Integer i zaplanujesz wydruk każdego z nich po 30 sekundach na raz. Spróbuj zwiększyć czas trwania do 30 dla każdej pętli.

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 .... Idealnie! Dziękuję za Twoją odpowiedź. – Jet