Допустим, я хочу отправлять кучу электронных писем или воссоздавать карту сайта или что-то еще каждые 4 часа, как бы я делал это в Фениксе или только с Elixir?
elixir
phoenix-framework
NoDisplayName
источник
источник
Process.send_after
в свою собственную функцию, чтобы функция могла быть вызвана как из, такinit
и изhandle_info
?:timer.send_interval
это хорошо, но имейте в виду, что интервалы будут постоянными. Итак, представьте, что вы хотите что-то делать каждую минуту, и в будущем сама работа займет больше минуты. В таких случаях вы будете работать все время, и ваша очередь сообщений станет неограниченной. Решение выше всегда будет ждать заданный период после выполнения работы.Quantum позволяет создавать, находить и удалять задания во время выполнения.
Кроме того, вы можете передавать аргументы в функцию задачи при создании cronjob и даже изменять часовой пояс, если вас не устраивает UTC.
Если ваше приложение работает как несколько изолированных экземпляров (например, Heroku), существуют процессоры заданий, поддерживаемые PostgreSQL или Redis, которые также поддерживают планирование задач:
Обан: https://github.com/sorentwo/oban
Пример: https://github.com/akira/exq
Тоник: https://github.com/joakimk/toniq
Verk: https://github.com/edgurgel/verk
источник
Вы можете использовать erlcron для этого. Вы используете это как
A
job
- это двухэлементный кортеж. Первый элемент - это кортеж, который представляет расписание для задания, а второй элемент - это функция или MFA (Module, Function, Arity). В приведенном выше примере мы запускаем:io.fwrite("It's 2 Thursday morning")
каждые 2 часа ночи четверга.Надеюсь, это поможет!
источник
Я использовал библиотеку Quantum Quantum- Elixir .
Следуйте инструкциям ниже.
Все готово. Запустите сервер, выполнив следующую команду.
источник
Я нахожу
:timer.send_interval/2
немного более эргономичным для использования сGenServer
чемProcess.send_after/4
(используется в принятом ответе ).Вместо того, чтобы перепланировать уведомление каждый раз, когда вы его обрабатываете,
:timer.send_interval/2
задайте интервал, в течение которого вы получаете сообщение бесконечно - не нужно продолжать звонить так,schedule_work()
как использует принятый ответ.Каждые 1000 мс (т. Е. Раз в секунду)
IntervalServer.handle_info/2
будут вызываться, распечатывать текущее значениеcount
и обновлять состояние GenServer (count + 1
), давая вам вывод, подобный следующему:источник
Помимо использования
Process.send_after
, вы также можете использовать : timer.apply_interval .источник
Quantum - это здорово, мы используем его на работе как замену cron на front-end феникса, а также добавляем задания в реальном времени, что очень удобно.
источник