我需要一些代码每天执行一次。一天可以不止一次,错过一天也不是世界末日。该代码将确保用户根据某些标准获得一些奖励积分。我会跟踪他们是否已经收到奖励积分,这样积分就不会加倍..
一些简单的 cron 作业偶尔调用特定的控制器是完美的:
curl http://localhost/tasks/pulse
当然,真正的 crontab 条目效果很好。或者Rails中有这种事情的内部机制吗?我正在使用最新的稳定 Rails(当前为 3.2.9)。
唯一的问题是这也需要在 Heroku 中工作。
我刚刚注意到Heroku 的调度程序。 Heroku 看起来很棒。我可以在我的开发/测试环境中手动运行这些任务。这是在 Rails 中处理脉冲/cron 作业的最佳方式吗?与耙子任务?很容易将正在运行的 rake 任务合并到测试中吗?
Heroku Scheduler 效果很好并且易于设置!
您可以查看这个名为 whenever 的 gem,它是一个 Ruby gem,为编写和部署 cron 作业提供了清晰的语法。它维护得很好,我自己没有在 Heroku 上使用它,但值得一看。
你可以做很多事情,比如
every 3.hours do
runner "MyModel.some_process"
rake "my:rake:task"
command "/usr/bin/my_great_command"
end
这是一个如何设置它的快速示例,以及我目前如何在产品环境中使用它
将 sidekiq 和 sidekiq-cron gem 添加到您的 Gemfile 中:
gem 'sidekiq'
gem 'sidekiq-cron'
为您的任务创建一个工作类:
class RakeTaskWorker
include Sidekiq::Worker
def perform(task)
output = `bundle exec rails #{task} 2>&1`
status = $?.exitstatus
if status.zero?
Sidekiq.logger.info("Rake task '#{task}' executed successfully.")
else
Sidekiq.logger.error("Rake task '#{task}' failed with status #{status}: #{output}")
end
end
end
在
config/schedule.yml
中定义您的 cron 作业:
daily_bonus_worker:
cron: "0 0 * * *"
class: "RakeTaskWorker"
args:
- "generate:daily_bonus"