创建Quantum elixir作业

时间:2017-08-31 16:21:38

标签: elixir cron-task

我想创建一个量子灵丹妙药作业并控制它的执行时间。我从这开始:

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创建它的原因

2 个答案:

答案 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提供的一个例子。