Alors disons que je veux envoyer un tas d'e-mails ou recréer un plan du site ou quoi que ce soit toutes les 4 heures, comment ferais-je à Phoenix ou tout simplement avec Elixir?
elixir
phoenix-framework
NoDisplayName
la source
la source
Process.send_after
à sa propre fonction pour que la fonction puisse être appelée à partir des deuxinit
ethandle_info
?:timer.send_interval
va bien, mais gardez à l'esprit que les intervalles seront constants. Imaginez donc que vous voulez faire quelque chose à chaque minute et, à l'avenir, le travail lui-même prendra plus d'une minute. Dans de tels cas, vous travailleriez tout le temps et votre file d'attente de messages augmenterait sans limite. La solution ci-dessus attendra toujours la période donnée une fois le travail terminé.Quantum vous permet de créer, rechercher et supprimer des travaux lors de l'exécution.
De plus, vous pouvez passer des arguments à la fonction de tâche lors de la création d'un cronjob et même modifier le fuseau horaire si vous n'êtes pas satisfait de l'UTC.
Si votre application s'exécute en tant que plusieurs instances isolées (par exemple Heroku), il existe des processeurs de travaux soutenus par PostgreSQL ou Redis, qui prennent également en charge la planification des tâches:
Oban: https://github.com/sorentwo/oban
Exq: https://github.com/akira/exq
Toniq: https://github.com/joakimk/toniq
Verk: https://github.com/edgurgel/verk
la source
Vous pouvez utiliser erlcron pour cela. Vous l'utilisez comme
A
job
est un tuple à 2 éléments. Le premier élément est un tuple qui représente la planification du travail et le deuxième élément est la fonction ou un MFA (Module, Function, Arity). Dans l'exemple ci-dessus, nous courons:io.fwrite("It's 2 Thursday morning")
tous les 2h du jeudi.J'espère que cela pourra aider!
la source
J'ai utilisé la bibliothèque Quantum Quantum- Elixir .
Suivez les instructions ci-dessous.
Tout est prêt. Démarrez le serveur en exécutant la commande ci-dessous.
la source
Je trouve un
:timer.send_interval/2
peu plus ergonomique à utiliser avec unGenServer
queProcess.send_after/4
(utilisé dans la réponse acceptée ).Au lieu d'avoir à replanifier votre notification chaque fois que vous la manipulez,
:timer.send_interval/2
configurez un intervalle pendant lequel vous recevez un message à l'infini - pas besoin de continuer à appelerschedule_work()
comme la réponse acceptée l'utilise.Toutes les 1000 ms (c.-à-d., Une fois par seconde),
IntervalServer.handle_info/2
sera appelé, imprimera le courantcount
et mettra à jour l'état (count + 1
) du GenServer , vous donnant une sortie comme:la source
Outre l'utilisation
Process.send_after
, vous pouvez également utiliser : timer.apply_interval .la source
Quantum est génial, nous l'utilisons au travail en remplacement de cron avec un frontal Phoenix et nous ajoutons également des tâches en temps réel, ce qui est très soigné.
la source