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

Sidekiq Scheduler定时任务不执行问题排查及解决过程

解决Sidekiq Scheduler定时任务不执行及动态更新问题

问题现象

  • 手动执行任务、Web UI点击Enqueue Now均正常运行
  • 定时任务无法自动触发
  • 执行bundle exec sidekiq启动时显示“Schedules Loaded”

环境依赖

gem 'sidekiq', '~> 6.5.4'
gem 'sidekiq-scheduler', '~> 5.0.3'

初始配置(config/initializers/sidekiq.rb)

if Rails.env.test?
  require 'sidekiq/testing'

  Sidekiq::Testing.fake!
else
  Sidekiq.configure_server do |config|
    config.average_scheduled_poll_interval = 5
    config.on(:startup) do
      SidekiqScheduleManager::StartupManager.call
      Sidekiq.schedule = Sidekiq.get_all_schedules
    end
  end
  Sidekiq.configure_client do |config|
    config.average_scheduled_poll_interval = 5
  end
end

定时任务创建代码

def schedule_this(day)
  # 将午夜后的秒数转换为时间字符串,当前时间无关,仅需当日起始时间点
  time = (Time.current.beginning_of_day + daily_schedule[day].seconds).strftime('%H:%M')
  # 调度任务
  Sidekiq.set_schedule(
    "notify_#{member.id}_#{day}",
    schedule_arg(day, time, member)
  )
end

def schedule_arg(day, time, member)
  {
    # 'every' => ['1w', { 'first_at' => "#{day.capitalize} #{time}" }],
    # 'every' => "#{day} at #{time}",
    # 'every' => ['1w', { 'first_in' => "#{day} at #{time}" }],
    'cron' => Fugit::Nat.parse("every #{day} at #{time}").original,
    'class' => 'WaveJob',
    'args' => schedule_args_args(member)
  }
end

生成的调度记录示例:

{"notify_649754255af1d03b3aecba50_monday"=>{"cron"=>"0 9 * * 1", "class"=>"WaveJob", "args"=>"[some_json]"}}

排查过程

  1. 在:startup块中添加Sidekiq::Scheduler.reload_schedule!后,定时任务可正常执行,但修改任务的cron表达式后,调度规则无法更新
  2. 控制台执行Sidekiq::Scheduler.reload_schedule!时,提示SidekiqScheduler已禁用

最终解决方案

在Sidekiq服务端配置的:startup块中添加Sidekiq::Scheduler.dynamic = true,修改后的配置如下:

if Rails.env.test?
  require 'sidekiq/testing'

  Sidekiq::Testing.fake!
else
  Sidekiq.configure_server do |config|
    config.average_scheduled_poll_interval = 5
    config.on(:startup) do
      SidekiqScheduleManager::StartupManager.call
      Sidekiq.schedule = Sidekiq.get_all_schedules
      Sidekiq::Scheduler.dynamic = true # 新增配置
      Sidekiq::Scheduler.reload_schedule!
    end
  end
  Sidekiq.configure_client do |config|
    config.average_scheduled_poll_interval = 5
  end
end

添加后,定时任务可正常触发,且修改cron表达式后调度规则能动态更新。

内容的提问来源于stack exchange,提问作者teddybear

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:07:06