web-dev-qa-db-ja.com

ElixirまたはPhoenixフレームワークでコードを数時間ごとに実行するようにスケジュールするにはどうすればよいですか?

たとえば、4時間ごとに大量のメールを送信したり、サイトマップを再作成したりすると、フェニックスで、またはElixirだけでそれを行うことができますか?

170
NoDisplayName

外部の依存関係を必要としない単純な代替手段があります。

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, [])
343
José Valim

Quantum 実行時にジョブを作成、検索、削除できます。

さらに、cronjobを作成するときにタスク関数に引数を渡したり、UTCに満足できない場合はタイムゾーンを変更することもできます。

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

アプリが複数の分離されたインスタンス(Herokuなど)として実行されている場合、Redisが支援するジョブプロセッサがあり、タスクスケジューリングもサポートしています。

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

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

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

27
Svilen

そのために erlcron を使用できます。あなたはそれを次のように使用します

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

:erlcron.cron(job)

jobは2要素のタプルです。最初の要素はジョブのスケジュールを表すタプルであり、2番目の要素は関数またはMFA(Module、Function、Arity)です。上記の例では、木曜日の午前2時ごとに:io.fwrite("It's 2 Thursday morning")を実行しています。

お役に立てば幸いです!

22
Gjaldon

Quantumライブラリを使用しました Quantum- Elixir
以下の手順に従ってください。

#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 

Quantum は素晴らしいです。これは仕事でphoenixフロントエンドとのcronの置き換えとして使用し、 real-time にジョブを追加します。

0
thanos

Process.send_afterを使用する以外に、 :timer.apply_interval を使用することもできます。

0
YongHao Hu