在 Heroku 中运行的 Rails 应用程序的脉冲或 cron 作业

问题描述 投票:0回答:3

我需要一些代码每天执行一次。一天可以不止一次,错过一天也不是世界末日。该代码将确保用户根据某些标准获得一些奖励积分。我会跟踪他们是否已经收到奖励积分,这样积分就不会加倍..

一些简单的 cron 作业偶尔调用特定的控制器是完美的:

curl http://localhost/tasks/pulse

当然,真正的 crontab 条目效果很好。或者Rails中有这种事情的内部机制吗?我正在使用最新的稳定 Rails(当前为 3.2.9)。

唯一的问题是这也需要在 Heroku 中工作。

我刚刚注意到Heroku 的调度程序。 Heroku 看起来很棒。我可以在我的开发/测试环境中手动运行这些任务。这是在 Rails 中处理脉冲/cron 作业的最佳方式吗?与耙子任务?很容易将正在运行的 rake 任务合并到测试中吗?

ruby-on-rails ruby-on-rails-3 heroku cron ruby-on-rails-3.2
3个回答
1
投票

Heroku Scheduler 效果很好并且易于设置!


0
投票

您可以查看这个名为 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

0
投票

这是一个如何设置它的快速示例,以及我目前如何在产品环境中使用它

将 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"

https://github.com/sidekiq-cron/sidekiq-cron

© www.soinside.com 2019 - 2024. All rights reserved.