我想创建一个量子灵丹妙药作业并控制它的执行时间。我从这开始:
Quantum.Job.new(task: fn -> IO.puts "Hello!" end)
但它会抛出此错误:
** (KeyError) key :run_strategy not found in: [task: #Function<20.99386804/0 in :erl_eval.expr/5>]
(elixir) lib/keyword.ex:371: Keyword.fetch!/2
(quantum) lib/quantum/job.ex:58: Quantum.Job.new/1
我真的不明白run_strategy设置,它可能是值。
有人知道如何使用Quantum.Job.new或类似的结构创建量子作业吗?
注意:cron已经在使用它了:
config :sopitas, Sopitas.Scheduler,
jobs: [
# Every minute
{"@minutely", {Sopitas.Admin.FixtureController, :update_cron, []}},
{"@minutely", {Sopitas.Admin.StandingController, :update_cron, []}},
{"@daily", {Sopitas.Admin.LeagueController, :update_cron, []}},
]
但关键是要改变执行cron的时间,这就是我决定使用Quantum.Job.new创建它的原因
答案 0 :(得分:3)
解决方案比我想象的要容易。 Quantum文档说:
config:your_app,YourApp.Scheduler,jobs:[
#每分钟
{“* * * * ”,{Heartbeat,:send,[]}},
#每15分钟一次 {“ / 15 * * * *”,fn - &gt; System.cmd(“rm”,[“/ tmp / tmp_”])结束},
#运行18,20,22,0,2,4,6:
{“0 18-6 / 2 * * *”,fn - &gt; :mnesia.backup('/ var / backup / mnesia')end},
#每逢午夜运行一次:
{“@ daily”,{备份,:备份,[]}}
]
我按列表更改了元组,因此我可以为每个作业命名。我可以通过他们的名字取出他们并更改他们的日程安排:
config :sopitas, Sopitas.Scheduler,
jobs: [
[name: :redis_cleaning, schedule: "@daily", task: {Sopitas.NotificationController, :clear_redis, []}],
[name: :fixtures, schedule: "@daily", task: {Sopitas.Admin.FixtureController, :update_cron, []}],
[name: :standings, schedule: "@daily", task: {Sopitas.Admin.StandingController, :update_cron, []}],
[name: :leagues, schedule: "@daily", task: {Sopitas.Admin.LeagueController, :update_cron, []}],
# [name: :example_cron, schedule: "@minutely", task: fn -> IO.puts "Hello!" end],
]
我创建了一个处理作业的函数:
def change_cron(name, cron_expression) do
job = Sopitas.Scheduler.find_job(name)
unless job do
Quantum.Job.set_schedule(job, Crontab.CronExpression.Parser.parse! cron_expression)
end
end
我按如下方式调用该函数:
Sopitas.SportsController.change_cron :fixtures, "@daily"
Sopitas.SportsController.change_cron :fixtures, "@minutely"
答案 1 :(得分:0)
Quantum.Job
文档中的第一句话说:
结构永远不应该手工定义。使用
Acme.Scheduler.new_job/0
创建一个新作业,并使用下面提到的setter来改变作业。
Quantum.Job
本身是struct
three mandatory keys:
@enforce_keys [:run_strategy, :overlap, :timezone]
如果您仍然肯定要违反其指南,则应传递以下三个关键字,例如:
Quantum.Job.new(
task: fn -> IO.puts "Hello!" end,
run_strategy: %Quantum.RunStrategy.All{nodes: [:one, :two]},
timezone: "Europe/Zurich",
overlap: false
)
我建议你使用here提供的一个例子。