Супервайзер с Quantum Elixir Cron Job

Извинете ме, ако не разбирам добре еликсира, тъй като съм нов в него...

Използвам quantum-elixir като api на cron за динамично създаване на задания за cron. Когато някой ПУБЛИКУВА в маршрут, аз записвам подробностите за заданието на cron в моето Ecto Repo и след това едновременно създавам квантово задание с Quantum.add_job.

В процес на разработка, когато затворя сървъра си и го рестартирам, трябва да добавя отново всички мои cron задачи, защото те не оцеляват при рестартиране. Така че това ме накара да мисля, че ако приложението ми се срине, това ще ме накара да загубя всички задания за cron. (Мисля за сценарии, при които хоствам приложението на Google compute engine и по някаква причина трябва да направя нулиране на компютърния екземпляр, т.е. надстройки на кутията и т.н.)

Така че се чудех какъв е подходящият начин да рестартирам приложението си, като същевременно запазя тези cron задачи?

В момента имам следното:

worker(Task,[MyApp.RebootTask, :reboot, []], restart: :transient)

във функцията start на моя модул за приложение.

Това правилният подход ли е? Какви други съображения трябва да взема предвид?

Всякакви насоки са много ценени


person Terence Chow    schedule 11.12.2016    source източник


Отговори (2)


Отправям запитване към моята база данни и създавам списък с дефиницията на заданието за всеки елемент

%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
person juanseph    schedule 19.04.2020

Не изглежда, че Quantum продължава да поддържа динамично добавени cronjobs, тъй като по-типичният подход е да дефинирате вашите cronjobs (наименувани или по друг начин) във вашия config.exs.

Тъй като вече съхранявате подробностите за работата с Ecto, остава само да прочетете тези подробности и да ги прочетете, когато кандидатурата ви започне. Тъй като вече използвате Quantum, следното в config/config.exs трябва да свърши работа:

config :quantum, cron: [
  "@reboot": &MyApp.some_function_to_read_and_readd_my_cronjobs/0
]
person YellowApple    schedule 11.12.2016