2013-01-02 9 views
5

Ich frage mich, ob es eine Möglichkeit gibt, eine Akka-Nachricht von der Verarbeitung zu verzögern?Akka: Hinzufügen einer Verzögerung zu einem dauerhaften Postfach

Mein Anwendungsfall: Für jede Anfrage, die ich habe, habe ich eine kleine Menge Arbeit, die ich tun muss, und dann muss ich zwei Stunden später arbeiten.

Gibt es eine einfache Möglichkeit, die Verarbeitung einer Nachricht in AKKA zu verzögern? Ich weiß, dass ich wahrscheinlich eine externe verteilte Warteschlange wie ActiveMQ, RabbitMQ einrichten kann, die wahrscheinlich diese Funktion hat, aber ich eher nicht.

Ich weiß, ich müsste das Postfach dauerhaft machen, damit es Neustarts oder Abstürze überleben kann. Wir haben bereits Mongo-Setup, so dass ich wahrscheinlich die MongoBasedMailbox für Haltbarkeit verwenden.

Antwort

0

Es ist nicht ideal, aber die Akka Camel Quartz scheduler würde den Trick tun. Schwerer als der integrierte ActorSystem-Scheduler, aber weiß, dass Quartz seine eigenen Probleme hat.

+1

Können Sie ein Angebot oder einen Link zur Quartz-Haltbarkeit angeben? Wenn es solche Garantien nicht gibt, warum nicht [Plain Scheduler] (http://doc.akka.io/docs/akka/snapshot/scala/scheduler.html) verwenden? –

+0

Einverstanden, wenn das Ergebnis von "kleiner Arbeitsaufwand" Neustarts überleben muss, speichern Sie während "preRestart" nur irgendwie den Zustand. Haltbarkeit ist für Abstürze. – idonnie

+1

@ om-nom-nom - Quartz hat eine Funktion [persistent job] (http://quartz-scheduler.org/overview/features). – jamie

0

Sie können immer noch den normalen Akka-Scheduler verwenden, Sie müssen nur einen Status über die Persistenz des Darstellers behalten, um zu vermeiden, dass der Job verloren geht, wenn der Server neu gestartet wird.

Ich habe PersistentFsmActor vor kurzem verwendet - was den Zustand des Darstellers

beharrte in Ihrem Fall

Ich bin nicht sicher, halten Sie FSM (Finite State Machine) verwenden, so dass Sie im Grunde nur eine persistentActor verwenden könnte um die Zeit zu speichern, in der der Job eingefügt wurde, und einen Scheduler zu dieser Zeit zu starten. Auf diese Weise - selbst wenn Sie den Server neu gestartet haben, startet der Akteur und erstellt einen neuen geplanten Auftrag. Verwenden Sie die persistenten Daten, um die verbleibende Zeit zu berechnen.

+0

und Sie können auch https://github.com/ironfish/akka-persistence-mongo verwenden – Elyran

Verwandte Themen