如何在本地使用cron作业测试elixir应用程序

时间:2018-04-05 08:13:06

标签: cron elixir

在我的elixir应用程序中,我正在使用此库https://github.com/quantum-elixir/quantum-core实现一个cron作业。下面是我的相同代码。

defp deps do
  [{:quantum, "~> 2.2"},
   {:timex, "~> 3.0"}]
end

defmodule MyApp.Scheduler do
  use Quantum.Scheduler,
    otp_app: :my_app
end

defmodule MyApp.Application do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    children = [
      # This is the new line
      worker(MyApp.Scheduler, [])
    ]

    opts = [strategy: :one_for_one, name: MyApp.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

然后我正在配置cron job以打印这样的消息。

config :my_app, MyApp.Scheduler,
  jobs: [
    {"* * * * *", fn -> IO.puts("Hello QUANTUM!") end}
  ]

如何在本地测试cron作业是否正常。我试图使用mix run但似乎没有任何内容可以打印消息。

2 个答案:

答案 0 :(得分:3)

根据默认定义的Cron作业限制为1分钟。

请考虑以下时间表:

*     *     *   *    *        command to be executed
-     -     -   -    -
|     |     |   |    |
|     |     |   |    +----- day of week (0 - 6) (Sunday=0)
|     |     |   +------- month (1 - 12)
|     |     +--------- day of        month (1 - 31)
|     +----------- hour (0 - 23)
+------------- min (0 - 59)

您遇到的问题是您运行了程序,但在1分钟后退出,认为它不起作用。

如果一分钟后仍然没有看到任何内容,请执行:observer.start并仔细检查supervision树是否已启动并在Applications标签下运行。也许您忘记在mix文件中包含应用程序监督树的启动。

在这种情况下,您需要做的就是在mix文件中包含以下内容,以适用于mod字段下的具体内容:

  def application do
    [
      mod: {Cronjob.Application, []},
      extra_applications: [:logger]
    ]
  end

当然,当你需要运行测试时,等待几分钟只是为了确认你的代码是完全荒谬的。

正是出于这个原因,已经引入了扩展形式的cron作业,并且您正在使用的库也可以使用。

以下是这样做的方法:

  jobs: [
    {{:extended, "* * * * * *"}, {Cronjob, :hello, []}},
  ],

答案 1 :(得分:0)

我的不好,我忘了在混合文件中包含启动应用程序监督树。

  def application do
    [
      extra_applications: [:logger],
      mod: {CnabClient.Application, []}
    ]
  end