【问题标题】:Using Whenever gem with Rails Active Job to schedule a batch email job在 Rails Active Job 中使用 When gem 来安排批处理电子邮件作业
【发布时间】:2015-05-03 23:49:57
【问题描述】:

我正在尝试了解如何正确使用它,或者我是否将它用于正确的事情。我创建了一个工作:

  class ScheduleSendNotificationsJob < ActiveJob::Base
  queue_as :notification_emails

  def perform(*args)
      user_ids = User.
                joins(:receipts).
                where(receipts: {is_read: false}).
                select('DISTINCT users.id').
                map(&:id)

      user_ids.each do |user_id|
          SendNotificationsJob.create(id: user_id)
          Rails.logger.info "Scheduled a job to send notifications to user #{user_id}"
        end  
    end
   end

我想每天在固定的时间完成这项工作。该作业轮询以查看是否有任何未完成的通知,将它们分批,然后将它们发送给用户,以便用户可以收到一封带有一堆通知的电子邮件,而不是一堆电子邮件,每封电子邮件只有一个通知。我尝试使用延迟作业来执行此操作,但它似乎并非旨在定期安排某些事情。所以现在我正在尝试使用when gem,但我似乎无法弄清楚如何正确设置它。

这是我的 config/schedule.rb 文件中的内容:

every 1.minute do
   runner ScheduleSendNotifications.create
end

当我在控制台中运行 -i 时,我得到以下信息:

Lorenzs-MacBook-Pro:Heartbeat-pods lorenzsell$ whenever -i
config/schedule.rb:13:in `block in initialize': uninitialized constant Whenever::JobList::ScheduleSendNotifications (NameError)

我在这里做错了什么?我应该使用其他东西吗?我只是在学习 ruby​​ 和 rails,所以非常感谢任何帮助。谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby scheduling


    【解决方案1】:

    只要 gem 将字符串作为 runner 函数的参数。无论何时实际上都没有加载 Rails 环境,因此它不知道您的 ScheduleSendNotifications 类。

    下面的代码应该可以正确设置 crontab 以运行您的作业。

    every 1.minute do
      runner "ScheduleSendNotifications.create"
    end
    

    从您的项目目录运行whenever -w 以设置 crontab 文件。运行crontab -l查看写入的crontab文件。系统每分钟都会执行你的 Rails 运行器。如果出现问题,您可能需要从那里调试 ScheduleSendNotifications.create 代码。

    【讨论】:

    • 好的。负责处理错误。如何让它真正运行?
    • 在答案中添加了一些信息。如果有更多错误,请随时发布它们
    • 我用我正在调用的完整函数体更新了我的问题。那里有一个对 Rails 记录器的调用,似乎根本没有被调用。我假设cron作业不是每分钟都在运行。我在这里错过了什么吗?
    • 只要crontab -l 显示正确的cron,您的问题可能就不存在了。从这里调试的最佳方法是首先检查/var/log/whenever.log 是否有任何异常。如果这没有帮助,那么我会尝试通过复制并粘贴在您的 crontab 文件(crontab -l)中生成的命令来从命令行手动执行运行程序。
    • ScheduleSendNotifications.create...你的班级不是叫ScheduleSendNotificationsJob吗?另外,查看ActiveJob API,您想在上面调用perform_later,而不是create,是吗?
    猜你喜欢
    • 2014-11-06
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多