请原谅我,如果我不熟悉长生不老药,我就是新手......
我使用quantum-elixir作为cron api来动态创建cron作业。当某人发送到路线时,我将cron作业详细信息保存到我的Ecto Repo中,然后同时使用Quantum.add_job
创建量子作业。
在开发中,当我关闭我的服务器并重新启动它时,我必须重新添加我所有的cron作业,因为它们在重新启动后无法生存。所以这让我想到如果我的应用程序崩溃会让我失去所有的cron工作。 (我正在思考我在Google计算引擎上托管应用程序的情况,无论出于什么原因需要在计算实例上进行重置,例如盒子上的升级等)。
所以我想知道在保留这些cron作业的同时重新启动我的应用程序的适当方法是什么?
现在我有以下内容:
worker(Task,[MyApp.RebootTask, :reboot, []], restart: :transient)
在我的应用程序模块的start
函数中。
这是正确的做法吗?我需要考虑哪些其他因素?
非常感谢任何指导
答案 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
]