You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby on Rails中如何添加配置Resque定时任务?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 15:36:23