首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Quantum Elixir Cron作业主管

Quantum Elixir Cron作业主管
EN

Stack Overflow用户
提问于 2016-12-12 00:30:05
回答 2查看 731关注 0票数 0

如果我对长生不老药不是很了解,请原谅,因为我是新手。

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

在开发中,当我关闭服务器并重新启动它时,我必须重新添加所有的cron作业,因为它们在重新启动后不会继续存在。因此,这让我思考,如果我的应用程序崩溃,那将使我失去所有cron作业。(我正在考虑这样的场景:我在Google计算引擎上托管应用程序,并且出于任何原因需要在计算实例上进行重置,即在计算机上进行升级等。)

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

现在,我有以下几点:

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

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

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

任何指导都非常感谢。

EN

回答 2

Stack Overflow用户

发布于 2020-04-19 14:26:56

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

代码语言:javascript
复制
%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"
}

为了让作业在应用程序启动时启动,我执行如下操作

代码语言:javascript
复制
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

在我的应用程序启动

代码语言:javascript
复制
  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
EN

Stack Overflow用户

发布于 2016-12-12 05:20:21

它看起来不像Quantum持久化动态添加的cronjob,因为更典型的方法是在config.exs中定义您的cronjob(命名或其他)。

由于您已经使用Ecto存储了作业详细信息,因此只需读取这些详细信息并在应用程序启动时读取它们即可。既然你已经在使用Quantum了,下面的config/config.exs代码就可以解决这个问题了:

代码语言:javascript
复制
config :quantum, cron: [
  "@reboot": &MyApp.some_function_to_read_and_readd_my_cronjobs/0
]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41088378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档