2016-06-07 13 views
2

Ich lade Play mit einem Akka-Cluster. Ich brauche einen "Singleton Scheduler", um einige Aufgaben pro Stunde auszuführen.Akka Cluster Singleton als Scheduler

Was ich bisher herausgefunden habe, ist, dass ich ClusterSinglegonManager verwenden sollte. Aber ich bin mir nicht sicher, wie mein Schauspieler aussehen muss. Meiner Meinung nach würde ich keine "Empfang" -Methode benötigen.

Das heißt, wie ich meine Singleton instatiate:

system.actorOf(
    ClusterSingletonManager.props(
    singletonProps = MySingletonActor.props(configuration), 
    terminationMessage = PoisonPill, 
    settings = ClusterSingletonManagerSettings(system)), 
    name = "mysingletonactor") 

Das würde passen:

object MySingletonActor { 
    def props(configuration: Configuration): Props = Props(new MySingletonActor(configuration)) 
} 

class MySingletonActor(configuration: Configuration) extends Actor with ActorLogging { 
    context.system.scheduler.schedule(2 seconds, 2 seconds)(println("Hallo Welt")) 
    def receive = ??? 
} 

Aber natürlich ist es wirft Ausnahmen, wegen der fehlenden Umsetzung des Verfahrens erhalten. Aber es funktioniert.

Was ist der beste Weg, um hier zu gehen? Es fühlt sich unbeholfen nur einen „Tick“ planen und die Zecke in der Empfangs Methode ... Griff

class MySingletonActor(configuration: Configuration) extends Actor with ActorLogging { 
    case object Tick 
    context.system.scheduler.schedule(2 seconds, 2 seconds, self, Tick) 
    def receive = { case Tick => println("Hallo Welt") } 
} 

Gibt es irgendeine Art von Singleton Scheduler in Akka?

Antwort

2

Anstatt ??? als Empfangsmethode zu schreiben, können Sie Actor.emptyBehavior verwenden, um keine Ausnahme auszulösen. Dies ist ein Receive-Ausdruck, der überhaupt nie mit Nachrichten übereinstimmt.

+0

Wenn Sie nur den Scheduler verwenden möchten, können Sie ihn direkt von Ihrem System verwenden, Ihre Nachricht planen und in den Parametern einen 'ActorRef' angeben, wer die Nachricht erhalten soll. Der einzige Vorteil ist, dass Sie einen Singleton-Akteur haben, der eine Nachricht empfangen kann, um den Timer zu stoppen oder abzubrechen. –

+0

Ich starte den Scheduler bei App Start. Ich habe die Funktionalität wie ein Cron-Job. Wenn ich also 5 Anwendungen im Cluster starte, wird der Scheduler 5 mal gestartet. Genau das möchte ich vermeiden. – gun