【问题标题】:Create Quantum elixir jobs创建 Quantum Elixir 职位
【发布时间】:2017-09-01 06:00:20
【问题描述】:

我想创建一个量子灵药作业并控制它的执行时间。我从这个开始:

Quantum.Job.new(task: fn -> IO.puts "Hello!" end)

但它会抛出此错误:

** (KeyError) key :run_strategy not found in: [task: #Function<20.99386804/0 in :erl_eval.expr/5>]
    (elixir) lib/keyword.ex:371: Keyword.fetch!/2
    (quantum) lib/quantum/job.ex:58: Quantum.Job.new/1

我真的不明白 run_strategy 设置及其可能的值。

有人知道如何使用 Quantum.Job.new 或类似的结构创建量子作业吗?

注意:cron 已经在使用这个:

config :sopitas, Sopitas.Scheduler,
  jobs: [
    # Every minute
    {"@minutely", {Sopitas.Admin.FixtureController, :update_cron, []}},
    {"@minutely", {Sopitas.Admin.StandingController, :update_cron, []}},
    {"@daily", {Sopitas.Admin.LeagueController, :update_cron, []}},
  ]

但重点是更改 cron 的执行时间,这就是为什么我决定使用 Quantum.Job.new 创建它的原因

【问题讨论】:

    标签: elixir cron-task


    【解决方案1】:

    解决方案比我想象的要容易。 Quantum 文档说:

    配置:your_app,YourApp.Scheduler,工作:[
    # 每分钟
    {"* * * * ", {心跳, :send, []}},
    # 每 15 分钟一次
    {"
    /15 * * * *", fn -> System.cmd("rm", ["/tmp/tmp_"]) end},
    # 在 18、20、22、0、2、4、6 运行:
    {"0 18-6/2 * * *", fn -> :mnesia.backup('/var/backup/mnesia') end},
    # 每天午夜运行:
    {"@daily", {备份, :backup, []}}
    ]

    我通过列表更改了元组,所以我可以命名每个作业。我可以通过他们的名字获取他们并更改他们的日程安排:

    config :sopitas, Sopitas.Scheduler,
      jobs: [
        [name: :redis_cleaning, schedule: "@daily", task: {Sopitas.NotificationController, :clear_redis, []}],
        [name: :fixtures, schedule: "@daily", task: {Sopitas.Admin.FixtureController, :update_cron, []}],
        [name: :standings, schedule: "@daily", task: {Sopitas.Admin.StandingController, :update_cron, []}],
        [name: :leagues, schedule: "@daily", task: {Sopitas.Admin.LeagueController, :update_cron, []}],
        # [name: :example_cron, schedule: "@minutely", task: fn -> IO.puts "Hello!" end],
      ]
    

    我创建了一个处理工作的函数:

      def change_cron(name, cron_expression) do
        job = Sopitas.Scheduler.find_job(name)
        unless job do
          Quantum.Job.set_schedule(job, Crontab.CronExpression.Parser.parse! cron_expression)
        end
      end
    

    我按如下方式调用该函数:

    Sopitas.SportsController.change_cron :fixtures, "@daily"
    Sopitas.SportsController.change_cron :fixtures, "@minutely"
    

    【讨论】:

      【解决方案2】:

      Quantum.Job 文档中的第一句话说:

      结构体不应该手动定义。使用Acme.Scheduler.new_job/0 创建一个新作业并使用下面提到的设置器来改变该作业。

      Quantum.Job 本身是一个structthree mandatory keys

      @enforce_keys [:run_strategy, :overlap, :timezone]
      

      如果您仍然确定要违反他们的准则,则应传递这三个关键字,例如:

      Quantum.Job.new(
        task: fn -> IO.puts "Hello!" end,
        run_strategy: %Quantum.RunStrategy.All{nodes: [:one, :two]},
        timezone: "Europe/Zurich",
        overlap: false
      )
      

      不过,我建议您使用here 提供的示例之一。

      【讨论】:

      • 你说得对,问题是我无法使用 Acme.Scheduler 模块iex(6)&gt; Acme.Scheduler.config |&gt; Quantum.Job.new ** (UndefinedFunctionError) function Acme.Scheduler.config/0 is undefined (module Acme.Scheduler is not available) Acme.Scheduler.config() 并且找不到与此错误相关的内容。
      • 你以iex -S mix运行它吗?
      • 只是这些第一次尝试,一旦它起作用,我将在我的项目中创建一个函数作为模块的一部分。你给我推荐其他策略吗?
      猜你喜欢
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多