たとえば、4時間ごとに大量のメールを送信したり、サイトマップを再作成したりすると、フェニックスで、またはElixirだけでそれを行うことができますか?
外部の依存関係を必要としない単純な代替手段があります。
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
監督ツリーで:
worker(MyApp.Periodically, [])
Quantum 実行時にジョブを作成、検索、削除できます。
さらに、cronjobを作成するときにタスク関数に引数を渡したり、UTCに満足できない場合はタイムゾーンを変更することもできます。
https://github.com/c-rack/quantum-elixir
アプリが複数の分離されたインスタンス(Herokuなど)として実行されている場合、Redisが支援するジョブプロセッサがあり、タスクスケジューリングもサポートしています。
Exq: https://github.com/akira/exq
そのために erlcron を使用できます。あなたはそれを次のように使用します
job = {{:weekly, :thu, {2, :am}},
{:io, :fwrite, ["It's 2 Thursday morning~n"]}}
:erlcron.cron(job)
job
は2要素のタプルです。最初の要素はジョブのスケジュールを表すタプルであり、2番目の要素は関数またはMFA(Module、Function、Arity)です。上記の例では、木曜日の午前2時ごとに:io.fwrite("It's 2 Thursday morning")
を実行しています。
お役に立てば幸いです!
Quantumライブラリを使用しました Quantum- Elixir 。
以下の手順に従ってください。
#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
]
準備完了。以下のコマンドを実行してサーバーを起動します。
iex -S mix phoenix.server
Process.send_after
を使用する以外に、 :timer.apply_interval を使用することもできます。