【问题标题】:Supervisor with Quantum Elixir Cron Job具有 Quantum Elixir Cron 工作的主管
【发布时间】:2017-04-26 13:58:56
【问题描述】:

如果我不太了解长生不老药,请原谅我,因为我是新手...

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

在开发中,当我关闭服务器并重新启动它时,我必须重新添加我所有的 cron 作业,因为它们无法通过重新启动而存活。所以这让我想到,如果我的应用程序崩溃,那会让我失去所有的 cron 工作。 (我正在考虑我在 Google 计算引擎上托管应用程序并且出于某种原因需要对计算实例进行重置,即在盒子上进行升级等的场景。)

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

现在我有以下内容:

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

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

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

非常感谢任何指导

【问题讨论】:

    标签: cron elixir erlang-supervisor gen-server


    【解决方案1】:

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

    %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
    

    在我的应用程序开始

      def start(_type, _args) do
        [
          Alerts.Repo,
          AlertsWeb.Endpoint |> supervisor([]),
          if(System.get_env() != :test, do: Alerts.Scheduler),
          Alerts.VersionSupervisor |> supervisor([])
        ]
        |> Supervisor.start_link(strategy: :one_for_one, name: Alerts.Supervisor)
      end
    

    【讨论】:

      【解决方案2】:

      看起来 Quantum 不会保留动态添加的 cronjob,因为更典型的方法是在您的 config.exs 中定义您的 cronjob(已命名或以其他方式命名)。

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

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

      【讨论】:

        猜你喜欢
        • 2018-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-29
        • 1970-01-01
        • 2016-07-03
        • 1970-01-01
        相关资源
        最近更新 更多