我如何安排代码在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