Entonces, digamos que quiero enviar un montón de correos electrónicos o recrear el mapa del sitio o lo que sea cada 4 horas, ¿cómo haría eso en Phoenix o simplemente con Elixir?
elixir
phoenix-framework
NoDisplayName
fuente
fuente
Process.send_after
a su propia función para que la función pueda llamarse desde ambosinit
yhandle_info
?:timer.send_interval
está bien, pero tenga en cuenta que los intervalos serán constantes. Imagine que quiere hacer algo cada minuto y, en el futuro, el trabajo en sí mismo lleva más de un minuto. En tales casos, estaría trabajando todo el tiempo y su cola de mensajes crecería sin límites. La solución anterior siempre esperará el período dado después de que se realice el trabajo.Quantum le permite crear, encontrar y eliminar trabajos en tiempo de ejecución.
Además, puede pasar argumentos a la función de tarea al crear un cronjob e incluso modificar la zona horaria si no está satisfecho con UTC.
Si su aplicación se ejecuta como varias instancias aisladas (por ejemplo, Heroku), hay procesadores de trabajo respaldados por PostgreSQL o Redis, que también admiten la programación de tareas:
Oban: https://github.com/sorentwo/oban
Exq: https://github.com/akira/exq
Toniq: https://github.com/joakimk/toniq
Verk: https://github.com/edgurgel/verk
fuente
Puedes usar erlcron para eso. Lo usas como
A
job
es una tupla de 2 elementos. El primer elemento es una tupla que representa la programación del trabajo y el segundo elemento es la función o un MFA (Módulo, Función, Aridad). En el ejemplo anterior, corremos:io.fwrite("It's 2 Thursday morning")
cada 2am del jueves.¡Espero que ayude!
fuente
Usé la biblioteca Quantum Quantum -Elixir .
Siga las instrucciones a continuación.
Todo listo. Inicie el servidor ejecutando el siguiente comando.
fuente
Encuentro un
:timer.send_interval/2
poco más ergonómico para usar con unGenServer
queProcess.send_after/4
(usado en la respuesta aceptada ).En lugar de tener que reprogramar su notificación cada vez que la maneja,
:timer.send_interval/2
establece un intervalo en el que recibe un mensaje sin cesar, sin necesidad de seguir llamandoschedule_work()
como lo usa la respuesta aceptada.Cada 1000 ms (es decir, una vez por segundo),
IntervalServer.handle_info/2
se llamará, imprimirá el actualcount
y actualizará el estado del GenServer (count + 1
), dándole un resultado como:fuente
Además de usar
Process.send_after
, también puedes usar : timer.apply_interval .fuente
Quantum es genial, lo usamos en el trabajo como un reemplazo de cron con un front-end de Phoenix y también agregamos trabajos en tiempo real cual es muy bueno.
fuente