Nao000のぶろぐ

蝶を追っている少年になりたい

【Elixir Phoenix】Elixirで処理を定期実行してくれる"Quantum.Scheduler"を試してみた記録

目次

  1. バージョン情報
  2. Quantum.Schedulerとは
  3. 使用までの概要
  4. サンプル
  5. 使用用途例
  6. 参考文献

バージョン情報

Elixir: 1.8.1

Phoenix: 1.4.2

Quantum.Schedulerとは

cronのように定期的に処理を実行してくれるモジュールです。

使用までの概要

  1. モジュールのインストール
  2. 定期実行したいモジュールと関数を作成
  3. supervision treeに登録
  4. スケジュール登録
  5. 実行確認

サンプル

基本的に公式サンプルに従っています。なので一次情報元を積極的に参照する勢は公式をご参照ください。

公式

モジュールのインストール

mix.exs に依存関係を記載し、mix deps.get します。

  {:quantum, "~> 2.3"},
  {:timex, "~> 3.0"}

定期実行したいモジュールと関数を作成

モジュールを作成し、コンソールに"test scheduler"と出力するだけの関数 testfunc/0 を用意します。

defmodule Nao000dotcom.Scheduler do
  use Quantum.Scheduler,
    otp_app: :nao000dotcom

  def testfunc do
    IO.puts("test scheduler")
  end
end

supervision treeに登録

supervision treeが何か良くわかってないですが、常時監視するものだと思ってます。

defmodule Nao000dotcom.Application do
  ...
  def start(_type, _args) do
    import Supervisor.Spec, warn: false # add
    children = [
      ...
      Nao000dotcom.Scheduler # add
    ]

   ...
  end
  ...
end

スケジュール登録

config.exs にjobを設定します。以下のコードは、「Nao000dotcom.Schedulerモジュール」の「testfunc関数」を「毎秒」実行に設定しています。時刻の指定や実行したい処理の指定方法などは公式ドキュメントを参照してください。

config :nao000dotcom, Nao000dotcom.Scheduler,
  jobs: [
    {{:extended, "* * * * *"},      {Nao000dotcom.Scheduler, :testfunc, []}}
  ]

実行確認

mix phx.server で実行します。コンソール画面を載せます。最後の行に "test scheduler" と出力されているのがわかります。phx.server を停止しない限り、毎秒出力されます。

/home/nao000dotcom # mix phx.server
[info] [swarm on nonode@nohost] [tracker:init] started
[info] Running Nao000dotcomWeb.Endpoint with cowboy 2.6.3 at 0.0.0.0:4000 (http)
[info] Access Nao000dotcomWeb.Endpoint at http://localhost:4000
[debug] [:nonode@nohost][Elixir.Quantum.JobBroadcaster] Loading Initial Jobs from Config
[debug] [:nonode@nohost][Elixir.Quantum.ExecutionBroadcaster] Unknown last execution time, using now
[debug] [:nonode@nohost][Elixir.Quantum.ExecutionBroadcaster] Adding job #Reference<0.4284689494.1353187330.160674>
[debug] [:nonode@nohost][Elixir.Quantum.ExecutionBroadcaster] Continuing Execution Broadcasting ASAP (2019-08-10T04:03:02)
[debug] [:nonode@nohost][Elixir.Quantum.ExecutionBroadcaster] Scheduling job for execution #Reference<0.4284689494.1353187330.160674>
[debug] [:nonode@nohost][Elixir.Quantum.ExecutionBroadcaster] Continuing Execution Broadcasting at -576460743997 (2019-08-10T04:03:03)
[debug] [:nonode@nohost][Elixir.Quantum.Executor] Task for job #Reference<0.4284689494.1353187330.160674> started on node :nonode@nohost
[debug] [:nonode@nohost][Elixir.Quantum.Executor] Execute started for job #Reference<0.4284689494.1353187330.160674>
test scheduler

使用用途例

Elixirで、DBデータの定期削除・定期バックアップなどに使えます。

参考文献