Quantum Elixir Cron Job的主管

时间:2016-12-11 16:30:05

标签: cron elixir supervisor gen-server

请原谅我,如果我不熟悉长生不老药,我就是新手......

我使用quantum-elixir作为cron api来动态创建cron作业。当某人发送到路线时,我将cron作业详细信息保存到我的Ecto Repo中,然后同时使用Quantum.add_job创建量子作业。

在开发中,当我关闭我的服务器并重新启动它时,我必须重新添加我所有的cron作业,因为它们在重新启动后无法生存。所以这让我想到如果我的应用程序崩溃会让我失去所有的cron工作。 (我正在思考我在Google计算引擎上托管应用程序的情况,无论出于什么原因需要在计算实例上进行重置,例如盒子上的​​升级等)。

所以我想知道在保留这些cron作业的同时重新启动我的应用程序的适当方法是什么?

现在我有以下内容:

worker(Task,[MyApp.RebootTask, :reboot, []], restart: :transient)

在我的应用程序模块的start函数中。

这是正确的做法吗?我需要考虑哪些其他因素?

非常感谢任何指导

2 个答案:

答案 0 :(得分:2)

我查询数据库并创建一个包含每个项目的作业定义的列表

_id

要在应用程序启动时开始工作,我要做类似的事情

%Quantum.Job{
      name: job_name,
      overlap: false,
      run_strategy: %Quantum.RunStrategy.Random{nodes: :cluster},
      schedule: Crontab.CronExpression.Parser.parse!(schedule),
      task: task,
      state: :active,
      timezone: "Europe/Zurich"
}

在我的应用程序中启动

defmodule Alerts.Scheduler do


use Quantum.Scheduler, otp_app: :alerts
  require Logger

  @environmet_blacklist [:test]

  def init(opts) do
    case Enum.member?(@environmet_blacklist, Mix.env()) or IEx.started?() do
      true ->
        IO.inspect(opts)
        opts

      false ->
        delete_all_jobs()
        opts_with_jobs = get_startup_config(opts)
        opts_with_jobs |> IO.inspect()
        opts_with_jobs
    end
  end

  def get_startup_config(opts) do
    job_definition = Alerts.Business.Alerts.get_all_alert_jobs_config()
    (opts |> List.delete(List.keyfind(opts, :jobs, 0))) ++ [jobs: job_definition]
  end

答案 1 :(得分:0)

看起来昆腾不会动态添加cronjobs,因为更典型的方法是在config.exs中定义你的cronjobs(名字或其他)。

由于您已经使用Ecto存储作业详细信息,因此只需阅读这些详细信息并在应用程序启动时读取它们即可。由于您已经在使用Quantum,config/config.exs中的以下内容应该可以解决问题:

config :quantum, cron: [
  "@reboot": &MyApp.some_function_to_read_and_readd_my_cronjobs/0
]