Also sagen wir, ich möchte eine Reihe von E-Mails senden oder Sitemap neu erstellen oder was auch immer alle 4 Stunden, wie würde ich das in Phoenix oder nur mit Elixir tun?Wie kann ich festlegen, dass Code alle paar Stunden im Elixir- oder Phoenix-Framework ausgeführt wird?
Antwort
Es gibt eine einfache Alternative, die keine externen Abhängigkeiten benötigt:
defmodule MyApp.Periodically do
use GenServer
def start_link do
GenServer.start_link(__MODULE__, %{})
end
def init(state) do
schedule_work() # Schedule work to be performed at some point
{:ok, state}
end
def handle_info(:work, state) do
# Do the work you desire here
schedule_work() # Reschedule once more
{:noreply, state}
end
defp schedule_work() do
Process.send_after(self(), :work, 2 * 60 * 60 * 1000) # In 2 hours
end
end
Jetzt in Ihrer Aufsicht Baum:
worker(MyApp.Periodically, [])
Sie können erlcron dafür verwenden. Sie verwenden es wie
job = {{:weekly, :thu, {2, :am}},
{:io, :fwrite, ["It's 2 Thursday morning~n"]}}
:erlcron.cron(job)
Ein 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 (Module, Function, Arity). Im obigen Beispiel führen wir jeden Donnerstag um 02:00 Uhr :io.fwrite("It's 2 Thursday morning")
aus.
Hoffe, dass hilft!
Ja, es ist besser als nichts, danke. Ich werde die Frage für eine Weile unbeantwortet lassen, vielleicht gibt es andere Vorschläge – JustMichael
Gern geschehen! Es gibt auch https://github.com/c-rack/quantum-elixir, was eine Elixier-Lib ist, wenn du – Gjaldon
bevorzugst, ist das wirklich hilfreich, danke nochmal :) – JustMichael
Quantum ermöglicht Ihnen das Erstellen, Suchen und Löschen von Aufträgen zur Laufzeit .
Darüber hinaus können Sie Argumente an die Aufgabe Funktion übergeben, wenn ein cronjob zu schaffen und auch die Zeitzone ändern, wenn Sie mit UTC nicht zufrieden sind:
https://github.com/c-rack/quantum-elixir
Wenn Ihre App läuft als mehrere isolierte Instanzen (zB Heroku), gibt es Job-Prozessoren von Redis gesichert, die auch Aufgabenplanung unterstützen:
Exq: https://github.com/akira/exq
Ich denke, es wird ein Overkill für viele einfache Aufgaben sein, die es nicht erfordern, aber danke für die Antwort sowieso. – JustMichael
Eine Liste der verfügbaren Bibliotheken war hilfreich für mich. – sheldonkreger
verwendete ich Quantum Bibliothek Quantum- Elixir.
Folgen Sie den Anweisungen unten.
#your_app/mix.exs
defp deps do
[{:quantum, ">= 1.9.1"},
#rest code
end
#your_app/mix.exs
def application do
[mod: {AppName, []},
applications: [:quantum,
#rest code
]]
end
#your_app/config/dev.exs
config :quantum, :your_app, cron: [
# Every minute
"* * * * *": fn -> IO.puts("Hello QUANTUM!") end
]
Alle setzen. Starten Sie den Server, indem Sie den folgenden Befehl ausführen.
iex -S mix phoenix.server
Neben Process.send_after
zu verwenden, können Sie auch :timer.apply_interval verwenden.
- 1. Wie kann ich festlegen, dass tcpdump für eine bestimmte Zeit ausgeführt wird?
- 2. Wie Bindung der Parameter in PhoenixFramework (Elixir) arbeiten
- 3. Wie wird dieser Code im Compiler ausgeführt?
- 4. Wie kann ich festlegen, dass Cron alle eineinhalb Stunden bestimmte Befehle ausführt?
- 5. Ausführen einer Aufgabe alle paar Stunden
- 6. Wie kann ich verhindern, dass mein Code alle 1 oder 2 Jahre neu signiert wird?
- 7. Wie wird die Elixir-Anwendung ausgeführt?
- 8. Wie kann ich sicherstellen, dass alle meine Python-Code "kompiliert"?
- 9. Verhindern, dass Code vom Benutzer ausgeführt wird
- 10. Wie kann ich die Bindung einer DataGridTextColumn im Code festlegen?
- 11. ThemeResource im Code festlegen oder ändern
- 12. Wie kann ich feststellen, dass mein Cron-Job ausgeführt wird?
- 13. Wie kann ich verhindern, dass Code an einem bestimmten Datum ausgeführt wird?
- 14. TIMEZONE_CHANGED Intent wird alle paar Sekunden empfangen
- 15. Wie kann ich verhindern, dass mein Timer vom GC erfasst wird, bevor der Rückruf ausgeführt wird?
- 16. Wie wird die Schluckaufgabe im Visual Studio Code ausgeführt?
- 17. Kann ich sicherstellen, dass auf 5.10 geschriebener Perl-Code auf 5.8 ausgeführt wird?
- 18. Wie kann ich festlegen, dass Text kopiert wird, wenn das Bild kopiert wird?
- 19. Welcher Code wird im Hauptthread des Browsers ausgeführt?
- 20. Wie kann ich feststellen, ob der Rails-Code über Rake oder Skript/Generate ausgeführt wird?
- 21. Wie verhindere ich, dass PHP-Code nach einer Header-Weiterleitung ausgeführt wird?
- 22. Wie überprüfe ich, ob Code aus einem Nasentest ausgeführt wird?
- 23. Stellen Sie sicher, dass Schleife vollständig ausgeführt wird, bevor anderer Code in jQuery ausgeführt wird
- 24. Wie kann ich Flash-Video alle paar Minuten drehen?
- 25. Wie kann sichergestellt werden, dass der asynchrone Code ausgeführt wird, nachdem ein Stream verarbeitet wurde?
- 26. MapReduce-Code wird nur lokal ausgeführt. Wie führe ich meinen Code im verteilten Modus aus?
- 27. Wie verhindere ich, dass meine überschriebene control.OnPaint im winforms Designer ausgeführt wird?
- 28. Mein Code ausgeführt wird
- 29. Codeblock verhindert, dass Skript ausgeführt wird, aber interaktiv ausgeführt wird
- 30. Wie plane ich, dass eine Aufgabe einmal ausgeführt wird?
Es ist unmöglich, diese Sprache nicht zu lieben :) – JustMichael
Wo sollte Ich lege diese Datei ab? Unter lib/Verzeichnis von Phoenix Projekt? Wohin geht der Test, um/periodisch/* zu testen? – EugZol
In lib, weil es ein langwieriger Prozess ist. Sie können den Test setzen, was auch immer sinnvoll ist, vielleicht "test/my_app/periodically_test.exs". –