Nehmen wir also an, ich möchte alle 4 Stunden ein paar E-Mails senden oder eine Sitemap oder was auch immer neu erstellen. Wie würde ich das in Phoenix oder nur mit Elixir machen?
elixir
phoenix-framework
NoDisplayName
quelle
quelle
Process.send_after
in eine eigene Funktion zu wechseln, damit die Funktion von beideninit
und aufgerufen werden kannhandle_info
?:timer.send_interval
ist in Ordnung, aber denken Sie daran, dass die Intervalle konstant bleiben. Stellen Sie sich vor, Sie möchten jede Minute etwas tun, und in Zukunft dauert die Arbeit selbst mehr als eine Minute. In solchen Fällen würden Sie die ganze Zeit arbeiten und Ihre Nachrichtenwarteschlange würde unbegrenzt wachsen. Die obige Lösung wartet immer die angegebene Zeit, nachdem die Arbeit erledigt ist.Mit Quantum können Sie Jobs zur Laufzeit erstellen, suchen und löschen.
Darüber hinaus können Sie beim Erstellen eines Cronjobs Argumente an die Taskfunktion übergeben und sogar die Zeitzone ändern, wenn Sie mit UTC nicht zufrieden sind.
Wenn Ihre App als mehrere isolierte Instanzen ausgeführt wird (z. B. Heroku), gibt es Jobprozessoren, die von PostgreSQL oder Redis unterstützt werden und die auch die Aufgabenplanung unterstützen:
Oban: https://github.com/sorentwo/oban
Beispiel: https://github.com/akira/exq
Toniq: https://github.com/joakimk/toniq
Verk: https://github.com/edgurgel/verk
quelle
Sie können dafür Erlcron verwenden . Du benutzt es gerne
A
job
ist ein 2-Element-Tupel. Das erste Element ist ein Tupel, das den Zeitplan für den Job darstellt, und das zweite Element ist die Funktion oder ein MFA (Modul, Funktion, Arität). Im obigen Beispiel laufen wir:io.fwrite("It's 2 Thursday morning")
jeden Donnerstag um 2 Uhr morgens.Hoffentlich hilft das!
quelle
Ich habe die Quantenbibliothek Quantum-Elixir verwendet .
Befolgen Sie die nachstehenden Anweisungen.
Alles bereit. Starten Sie den Server, indem Sie den folgenden Befehl ausführen.
quelle
Ich finde es
:timer.send_interval/2
etwas ergonomischer, mit einem zu arbeitenGenServer
alsProcess.send_after/4
(in der akzeptierten Antwort verwendet ).Anstatt Ihre Benachrichtigung jedes Mal neu planen zu müssen, legen Sie
:timer.send_interval/2
ein Intervall fest, in dem Sie endlos eine Nachricht erhalten - Sie müssen nicht weiter anrufen,schedule_work()
wie es die akzeptierte Antwort verwendet.Alle 1000 ms (dh einmal pro Sekunde)
IntervalServer.handle_info/2
wird aufgerufen, der aktuellecount
Wert gedruckt und der Status des GenServers aktualisiert (count + 1
), sodass Sie folgende Ausgaben erhalten:quelle
Neben der Verwendung
Process.send_after
können Sie auch Folgendes verwenden : timer.apply_interval .quelle
Quantum ist großartig, wir verwenden es bei der Arbeit als Cron-Ersatz mit einem Phoenix-Frontend und wir fügen auch Jobs in Echtzeit hinzu, was sehr ordentlich ist.
quelle