web-dev-qa-db-fra.com

Comment planifier l'exécution du code toutes les quelques heures dans les environnements Elixir ou Phoenix?

Donc, disons que je veux envoyer un tas d'emails ou recréer un plan du site ou quoi que ce soit toutes les 4 heures, comment pourrais-je le faire à Phoenix ou simplement avec Elixir? 

154
NoDisplayName

Il existe une alternative simple qui ne nécessite aucune dépendance externe:

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

Maintenant dans votre arbre de supervision:

worker(MyApp.Periodically, [])
323
José Valim

Quantum vous permet de créer, rechercher et supprimer des travaux au moment de l'exécution.

De plus, vous pouvez passer des arguments à la fonction task lors de la création d'un cronjob et même modifier le fuseau horaire si vous n'êtes pas satisfait de l'UTC:

https://github.com/c-rack/quantum-elixir

Si votre application s'exécute sous la forme d'instances isolées multiples (par exemple Heroku), il existe des processeurs de travaux soutenus par Redis, qui prennent également en charge la planification des tâches:

Exq: https://github.com/akira/exq

Toniq: https://github.com/joakimk/toniq

Verk: https://github.com/edgurgel/verk

27
Svilen

Vous pouvez utiliser erlcron pour cela. Vous l'utilisez comme

job = {{:weekly, :thu, {2, :am}},
  {:io, :fwrite, ["It's 2 Thursday morning~n"]}}

:erlcron.cron(job)

Un job est un tuple à 2 éléments. Le premier élément est un tuple qui représente la planification du travail et le second élément est la fonction ou un MFA (module, fonction, élément). Dans l'exemple ci-dessus, nous exécutons :io.fwrite("It's 2 Thursday morning") chaque jeudi à 2 heures du matin.

J'espère que cela pourra aider!

22
Gjaldon

J'ai utilisé la bibliothèque Quantum Quantum- Elixir .
Suivez les instructions ci-dessous. 

#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
]

Tous ensemble. Démarrez le serveur en exécutant la commande ci-dessous.

iex -S mix phoenix.server 
5

Quantum est génial, nous l’utilisons au travail en remplacement de cron avec une interface frontale phénix et nous ajoutons également des emplois en temps réel , ce qui est très soigné.

0
thanos

En plus d'utiliser Process.send_after, vous pouvez également utiliser : timer.apply_interval .

0
YongHao Hu