我如何安排代码在Elixir或Phoenix框架中每几个小时运行一次?
所以,假设我想发送一堆电子邮件或重新创build站点地图,或者每4个小时重做一次,我怎样才能在Phoenix或者Elixir中做到这一点?
有一个简单的select,不需要任何外部依赖:
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, [])
你可以使用erlcron 。 你用它就好
job = {{:weekly, :thu, {2, :am}}, {:io, :fwrite, ["It's 2 Thursday morning~n"]}} :erlcron.cron(job)
job
是一个2元素的元组。 第一个元素是表示作业计划的元组,第二个元素是函数或MFA(模块,函数,Arity)。 在上面的例子中,我们:io.fwrite("It's 2 Thursday morning")
2点运行:io.fwrite("It's 2 Thursday morning")
。
希望有所帮助!
昆腾允许您在运行时创build,查找和删除作业。
此外,你可以在创build一个cronjob时将parameter passing给任务函数,甚至在你对UTC不满意时修改时区:
https://github.com/c-rack/quantum-elixir
如果您的应用程序以多个孤立实例(例如Heroku)运行,则由Redis支持的作业处理器也支持任务计划:
Exq: https : //github.com/akira/exq
Toniq: https : //github.com/joakimk/toniq
Verk: https : //github.com/edgurgel/verk
我使用了量子库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