2015-08-19 5 views

Antwort

256

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, []) 
+106

Es ist unmöglich, diese Sprache nicht zu lieben :) – JustMichael

+2

Wo sollte Ich lege diese Datei ab? Unter lib/Verzeichnis von Phoenix Projekt? Wohin geht der Test, um/periodisch/* zu testen? – EugZol

+8

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". –

21

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!

+0

Ja, es ist besser als nichts, danke. Ich werde die Frage für eine Weile unbeantwortet lassen, vielleicht gibt es andere Vorschläge – JustMichael

+3

Gern geschehen! Es gibt auch https://github.com/c-rack/quantum-elixir, was eine Elixier-Lib ist, wenn du – Gjaldon

+0

bevorzugst, ist das wirklich hilfreich, danke nochmal :) – JustMichael

20

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

toniq: https://github.com/joakimk/toniq

Verk: https://github.com/edgurgel/verk

+1

Ich denke, es wird ein Overkill für viele einfache Aufgaben sein, die es nicht erfordern, aber danke für die Antwort sowieso. – JustMichael

+0

Eine Liste der verfügbaren Bibliotheken war hilfreich für mich. – sheldonkreger

2

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 
Verwandte Themen