如果我对长生不老药不是很了解,请原谅,因为我是新手。
我使用quantum-elixir作为cron api来动态创建cron作业。当有人发布到某个路由时,我会将cron作业的详细信息保存到我的Ecto Repo中,然后同时使用Quantum.add_job创建一个量子作业。
在开发中,当我关闭服务器并重新启动它时,我必须重新添加所有的cron作业,因为它们在重新启动后不会继续存在。因此,这让我思考,如果我的应用程序崩溃,那将使我失去所有cron作业。(我正在考虑这样的场景:我在Google计算引擎上托管应用程序,并且出于任何原因需要在计算实例上进行重置,即在计算机上进行升级等。)
所以我想知道在保留这些cron作业的同时重启我的应用程序的合适方法是什么?
现在,我有以下几点:
worker(Task,[MyApp.RebootTask, :reboot, []], restart: :transient)
在我的应用程序模块的start函数中。
这是正确的方法吗?我还需要考虑哪些因素?
任何指导都非常感谢。
发布于 2020-04-19 14:26:56
我查询我的数据库并创建一个列表,其中包含每个项目的作业定义。
%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发布于 2016-12-12 05:20:21
它看起来不像Quantum持久化动态添加的cronjob,因为更典型的方法是在config.exs中定义您的cronjob(命名或其他)。
由于您已经使用Ecto存储了作业详细信息,因此只需读取这些详细信息并在应用程序启动时读取它们即可。既然你已经在使用Quantum了,下面的config/config.exs代码就可以解决这个问题了:
config :quantum, cron: [
"@reboot": &MyApp.some_function_to_read_and_readd_my_cronjobs/0
]https://stackoverflow.com/questions/41088378
复制相似问题