【问题标题】:Schedule Rails Task to run at a certain time安排 Rails 任务在特定时间运行
【发布时间】:2012-09-18 07:54:45
【问题描述】:

我目前正在创建一个 Rails 应用程序,并想了解如何安排某些任务在特定时间运行。

例如管理员希望在早上 8:00 向他的用户发送电子邮件,并且不想为了发送该电子邮件而早起。因此,他/她会想安排任务在那个时候发送电子邮件。

那么,有没有一种方法,或者更好的是 gem,可以让任务被安排在特定时间运行?谢谢!

【问题讨论】:

  • 活跃的工作可以做同样的事情吗?

标签: ruby-on-rails-3 scheduled-tasks


【解决方案1】:

我首选的解决方案是Whenever gem。

有了它,你就有了schedule.rb 文件,它指定了某些事情应该在什么时候完成,包括运行 rake 任务、执行方法,甚至执行任意 shell 命令:

示例 schedule.rb 文件,厚颜无耻地从 When readme 中复制:

every 3.hours do
  runner "MyModel.some_process"
  rake "my:rake:task"
  command "/usr/bin/my_great_command"
end

every 1.day, :at => '4:30 am' do
  runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end

every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
  runner "SomeModel.ladeeda"
end

every :sunday, :at => '12pm' do # Use any day of the week or :weekend, :weekday
  runner "Task.do_something_great"
end

every '0 0 27-31 * *' do
  command "echo 'you can use raw cron syntax too'"
end

# run this task only on servers with the :app role in Capistrano
# see Capistrano roles section below
every :day, :at => '12:20am', :roles => [:app] do
  rake "app_server:task"
end

我在很多任务中都使用Whenever,包括发送每日电子邮件。

【讨论】:

  • 谢谢!我是否需要创建一个任务文件来存储方法,或者我可以将方法添加到 schedule.rb 文件中吗?比如我想每分钟调用一次某个方法,可以直接输入“every 1.minute do ........ end”吗?
  • @user192249 除了 schedule.rb 之外,您不需要任何特殊文件 - 尽管我确实将所有任务都放入了一个或另一个类的类方法中。只需使用runner 给他们打电话,如上所述。
  • 太棒了!!非常感谢!
猜你喜欢
  • 2020-09-21
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 2010-12-31
相关资源
最近更新 更多