【发布时间】:2020-06-02 04:57:29
【问题描述】:
我正在开发一个 Rails 5.2 项目,该项目需要计划的异步任务每晚运行。我一直在研究使用whenever gem 触发ActiveJob job 和使用when 触发老式rake 任务(/lib/tasks/some_task.rake) 之间的区别 - 我正在努力寻找很多值得注意的方式无论哪种方式的优点和/或缺点。以下面两个基本的示例实现为例,这两种策略有什么区别?
我可以看到的不同之处在于,使用 ActiveJob,您可以获得selecting a queue 的额外灵活性以运行作业,而triggering callbacks around the job,在 rake 任务中,您仅限于单线程,并且没有可用的回调。
还有其他值得关注的区别吗?
活动作业
app/jobs/subscription_reminder_job.rb:
class SubscriptionReminderJob < ApplicationJob
queue_as :default
def perform
Subscription.overdue.find_each do |overdue_subscription|
UserMailer.subscription_reminder(overdue_subscription.user, overdue_subscription).deliver_later
overdue_subscription.touch(:last_subscription_reminder_sent_at)
end
end
end
config/schedule.rb:
every :day, at: '12:00am' do
runner "SubscriptionReminderJob.perform"
end
Rails 任务
lib/tasks/send_subscription_reminders.rake:
task send_subscription_reminders: :environment do
Subscription.overdue.find_each do |overdue_subscription|
UserMailer.subscription_reminder(overdue_subscription.user, overdue_subscription).deliver_later
overdue_subscription.touch(:last_subscription_reminder_sent_at)
end
end
config/schedule.rb:
every :day, at: '12:00am' do
rake "send_subscription_reminders"
end
【问题讨论】:
-
您想判断解决问题的两种方法之间的权衡。这太棒了!但是,为了让其他人以有意义的方式帮助您解决此问题,您需要提供有关问题所在的丰富细节。你想达到什么目的?工作或任务将做什么?它的行为是什么?否则我只能笼统地说。在判断一个工具时,您需要知道您将使用该工具的目的。
-
@PatrickQuigley 感谢您的反馈 - 示例已扩展,以显示遍历记录范围、发送电子邮件和更新属性。
-
根据您目前提供的内容添加了答案。它还会提示您提供更多信息。如果您确实提供了该信息,我可以更新答案,但是,它很有可能会为您提供足够的思考,让您进步朋友!让我知道你过得怎么样。
-
我的回答对你有帮助吗@slehmann36?
标签: ruby-on-rails rake rake-task whenever rails-activejob