Создание рабочих мест в квантовом эликсире

Я хочу создать задание квантового эликсира и контролировать время его выполнения. Я начал с этого:

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


person Lety Cruz    schedule 31.08.2017    source источник


Ответы (2)


Решение оказалось проще, чем я думал. В документации Quantum сказано:

config :your_app, YourApp.Scheduler, jobs: [
# Каждую минуту
{"* * * * ", {Heartbeat, :send, []}},
# Каждые 15 минут< br> {"
/15 * * * *", fn -> System.cmd("rm", ["/tmp/tmp_"]) end},
# Выполняется 18, 20, 22 , 0, 2, 4, 6:
{"0 18-6/2 * * *", fn -> :mnesia.backup('/var/backup/mnesia') end},
# Выполняется каждую полночь:
{"@daily", {Backup, :backup, []}}
]

Я изменил кортежи по спискам, чтобы я мог назвать каждую работу. Я могу получить их по именам и изменить их расписание:

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"
person Lety Cruz    schedule 31.08.2017

Самое первое предложение в документе Quantum.Job гласит:

Структура никогда не должна определяться вручную. Используйте Acme.Scheduler.new_job/0 для создания нового задания и используйте установщики, упомянутые ниже, для изменения задания.

Сам Quantum.Job представляет собой struct с три обязательных ключа:

@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
)

Тем не менее, я бы посоветовал вам использовать один из примеров, представленных здесь.

person Aleksei Matiushkin    schedule 31.08.2017
comment
Вы правы, проблема в том, что я не могу использовать модуль Acme.Scheduler iex(6)> Acme.Scheduler.config |> Quantum.Job.new ** (UndefinedFunctionError) function Acme.Scheduler.config/0 is undefined (module Acme.Scheduler is not available) Acme.Scheduler.config() и не могу найти что-то связанное с этой ошибкой. - person Lety Cruz; 31.08.2017
comment
Вы запускаете его как iex -S mix? - person Aleksei Matiushkin; 31.08.2017
comment
Только эти первые попытки, когда все заработает, я создам функцию как часть модуля в своем проекте. Вы рекомендуете мне другую стратегию? - person Lety Cruz; 31.08.2017