【rubygems】之 rufus-scheduler

image.png

一、rufus-scheduler是什么
rufus-scheduler 是一个很简单的做定时任务的程序包,基本上可以解决我们日常中的定时任务。

rufus-scheduler支持五种模式的任务定义, in、at、every、interval、cron。

二、安装
Bash
gem install rufus-scheduler

三、使用
新建一个Ruby文件 demo.rb,写入如下代码:

Ruby
require 'rubygems'
require 'rufus/scheduler'

scheduler = Rufus::Scheduler.new

scheduler.in '20m' do
puts "order ristretto"
end

scheduler.at '2018-12-06 12:05' do
puts 'order pizza'
end

scheduler.cron '0 22 * * 1-5' do

every day of the week at 22:00 (10pm)

puts 'activate security system'
end

scheduler.every '5m' do
puts 'check blood pressure'
end

scheduler.interval '2h' do
puts "thinking..."
puts sleep(rand * 1000)
puts "thought."
end

scheduler.join
然后我们把它运行起来, ruby demo.rb

四、和rails结合使用
创建 config/initializers/scheduler.rb

Ruby
require 'rufus-scheduler'

Let's use the rufus-scheduler singleton

scheduler = Rufus::Scheduler.singleton

return if defined?(Rails::Console) || Rails.env.test? || File.split($0).last == 'rake'
scheduler.every '2s' do
Rails.logger.info "hello, it's #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}"
Rails.logger.flush
end

五、注意事项

  1. 在 puma 的 deamon 模式下无法使用,具官方说明可以使用unicorn来跑
    或者使用runit等方法运行程序才可以

  2. 需使用代码禁止在console/test/rake下启动rufus-scheduler

六、优缺点
优点

不依赖其他外部工具,只在进程中就可以实现

时间可以精确到秒

模式众多 in/at/cron

缺点:

主进程关闭后就失效了

主进程关闭后会丢失之前所有已计划的任务

某个任务意外报错有可能导致整个进程退出