2012-04-01 6 views
1

Ich lerne das Play 2.0-Framework für Scala und abgesehen von der Möglichkeit, Anfragen zu bearbeiten, möchte ich eine kontinuierliche Aufgabe im Hintergrund ausführen, wie eine Reihe von Timern. Und irgendwie in der Lage sein, Zugriff auf diese Timer von den Anfrage-Antwort-Aktionen zu erhalten, ohne irgendwelche Thread-Synchronisationsprobleme zu bekommen. Ich habe von Jobs in Play gehört und es gibt Schauspieler in Scala. Ich kann jedoch keine Informationen über Jobs in 2.0 finden, sie scheinen durch Promises ersetzt worden zu sein. Aber das ist wirklich nicht so, als würde man einen hartnäckigen Hintergrund-Thread laufen lassen, und ich bin mir nicht sicher, wie Actors in das ganze Paradigma passen.Play 2.0 Framework - persistente Threads für den Haupt-App-Zyklus?

Grundsätzlich ist meine Frage - was ist der traditionelle Weg, um diese Art von Ausdauer in Play 2.0 zu bekommen.

Antwort

4

Nicht ganz richtig, die Jobs wurden nicht durch Promises ersetzt, sondern durch scheduling to send messages to actors (siehe "Asynchrone Tasks planen").

Wie auch immer, Schauspieler scheinen der Weg für dich zu sein. Play 2.0 verwendet dafür Akka. Es ist eigentlich ganz einfach. Auf der Akka-Homepage finden Sie detaillierte Erklärungen darüber, was Actors sind und was Sie damit tun können, aber Sie können sich einen Actor als einen Code (zB eine Funktion) mit einem Postfach vorstellen. Sie können Nachrichten an das Postfach senden, und die Funktion wird für jede Nachricht ausgeführt, die darauf wartet. Dies könnte nur ein periodisches Signal für einen wiederkehrenden Job oder eine Referenz für eine lange Hintergrundaufgabe sein, die ihm sagt, was es aktualisieren muss.

+0

Ok, ich habe das Play Tutorial über Akteure und Planung gelesen. Das Konzept der Actors scheint mir einfach und logisch zu sein, ich habe auch etwas Erfahrung mit ihnen in Erlang, daher scheint mir alles klar zu sein, bis auf eine Sache. Was ist der bevorzugte Weg, um den Thread-Aktualisierungszyklus zu organisieren? Muss ich einfach einen regulären Aktualisierungsimpuls an den Akteur richten, der den Thread repräsentiert, indem ich den Scheduler verwende? Oder starte ich einen Thread von einem Actor und organisiere den Zyklus in seiner 'run()' Methode? – noncom

+1

Keine zusätzlichen Threads erforderlich, wenn Sie einen Job planen möchten, um z. alle 30 Minuten, rufen Sie einfach 'Akka.system.scheduler.schedule (0 Sekunden, 30 Minuten, testActor," tick ")' und es wird es tun. Wenn Sie einen ereignisbasierten Update-Job benötigen (z. B. die Größe eines Bildes für die spätere Verwendung ändern, nachdem ein Benutzer es hochgeladen hat), senden Sie eine Nachricht an den Akteur, wenn der Job ausgeführt werden soll: 'myActor! MeineNachricht'. – Carsten

+0

Großartig, danke! Das deckt alles ab! – noncom