Как я могу запланировать запуск кода каждые несколько часов в Elixir или Phoenix framework?
Итак, допустим, я хочу отправить кучу писем или воссоздать карту сайта или что-то еще каждые 4 часа, как бы я это сделал в Фениксе или просто с эликсиром?
5 ответов:
существует простая альтернатива, которая не требует каких-либо внешних зависимостей:
defmodule MyApp.Periodically do use GenServer def start_link do GenServer.start_link(__MODULE__, %{}) end def init(state) do schedule_work() # Schedule work to be performed at some point {:ok, state} end def handle_info(:work, state) do # Do the work you desire here schedule_work() # Reschedule once more {:noreply, state} end defp schedule_work() do Process.send_after(self(), :work, 2 * 60 * 60 * 1000) # In 2 hours end end
теперь в вашем дереве наблюдения:
worker(MyApp.Periodically, [])
Quantum позволяет создавать, находить и удалять задания на выполнения.
кроме того, вы можете передать аргументы в функцию задачи при создании cronjob, и даже изменить часовой пояс, если вы не довольны UTC:
https://github.com/c-rack/quantum-elixir
Если ваше приложение работает как несколько изолированных экземпляров (например, Heroku), есть процессоры заданий, поддерживаемые Redis, которые также поддерживают задачу планирование:
Exq: https://github.com/akira/exq
можно использовать erlcron для этого. Вы используете его как
job = {{:weekly, :thu, {2, :am}}, {:io, :fwrite, ["It's 2 Thursday morning~n"]}} :erlcron.cron(job)
A
job
- это кортеж из 2 элементов. Первый элемент-это кортеж, представляющий расписание для задания, а второй элемент-функция или MFA(Module, Function, Arity). В приведенном выше примере, мы запускаем:io.fwrite("It's 2 Thursday morning")
каждый 2 часа ночи в четверг.надеюсь, что это поможет!
я использовал квантовую библиотека Квантово - Эликсир.
Следуйте приведенным ниже инструкциям.#your_app/mix.exs defp deps do [{:quantum, ">= 1.9.1"}, #rest code end #your_app/mix.exs def application do [mod: {AppName, []}, applications: [:quantum, #rest code ]] end #your_app/config/dev.exs config :quantum, :your_app, cron: [ # Every minute "* * * * *": fn -> IO.puts("Hello QUANTUM!") end ]
все готово. Запустите сервер, выполнив команду ниже.
iex -S mix phoenix.server
кроме того, чтобы использовать
Process.send_after
, вы также можете использовать :таймер.apply_interval.