Ruby on Rails中如何添加配置Resque定时任务?
Resque 本身没有内置定时任务调度能力,你之前搭配 Sidekiq 使用的 Sidetiq 是 Sidekiq 专属调度扩展,其recurrence语法无法直接在 Resque 中复用。Resque 生态通用的定时任务实现方案是搭配 resque-scheduler 扩展完成,具体配置步骤如下:
1. 安装依赖
在项目的 Gemfile 中添加所需依赖:
gem 'resque' gem 'resque-scheduler'
执行命令完成安装:
bundle install
2. 修正任务类写法
Resque 任务不需要引入 Sidekiq 相关的 Worker 模块,也不需要在任务类中引入resque/server(该组件仅用于Web管理后台),只需要实现self.perform方法作为任务执行入口即可,对应你要迁移的每日任务正确写法如下:
class SetCurrentBugDay def self.perform # 此处写入原SetCurrentDay任务的业务逻辑 # 例如每日0点重置当日统计数据、初始化当日配置等操作 end end
3. 配置定时调度规则
resque-scheduler 支持两种配置方式,二选一即可:
方式1:YAML文件统一管理(推荐)
在项目config目录下新建resque_schedule.yml,写入对应调度规则,和你原有「每日0点0分执行」的逻辑完全匹配的配置如下:
set_current_bug_day: cron: "0 0 * * *" # Cron表达式顺序为 分 时 日 月 周,该配置等价于原recurrence { daily.hour_of_day(0).minute_of_hour(0) } class: "SetCurrentBugDay" queue: default # 可根据项目实际队列配置修改队列名 description: "每日0点执行当日数据初始化任务"
多个定时任务直接在该YAML文件中追加配置项即可。
方式2:Ruby代码动态配置
如果不需要单独的配置文件,也可以直接在Resque初始化文件中配置调度规则,例如在config/initializers/resque.rb中写入:
require 'resque/scheduler' Resque.schedule = { set_current_bug_day: { cron: "0 0 * * *", class: "SetCurrentBugDay", queue: :default, description: "每日0点执行当日数据初始化任务" } }
4. 启动相关进程
配置完成后,除了常规的Resque Worker进程,还需要单独启动调度进程,该进程会按照配置的时间规则自动将任务投递到Resque队列中执行:
# 普通项目启动命令 rake resque:scheduler # Rails项目需要指定环境启动 RAILS_ENV=production rake resque:scheduler
如果需要在Resque Web后台查看、管理定时任务,只需要在路由挂载Resque控制台时额外引入调度器的视图扩展即可:
# 以Rails路由配置为例 config/routes.rb require 'resque/server' require 'resque/scheduler/server' # 新增该行引入定时任务管理页面 mount Resque::Server.new, at: '/resque'
注意:如果需要实现更复杂的调度规则(如仅工作日执行、固定间隔执行等),直接修改对应配置项的Cron表达式即可,可完全覆盖原Sidetiq支持的所有调度场景。
内容的提问来源于stack exchange,提问作者User

