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]"}}
排查过程
- 在
:startup块中添加Sidekiq::Scheduler.reload_schedule!后,定时任务可正常执行,但修改任务的cron表达式后,调度规则无法更新 - 控制台执行
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
相关产品推荐
相关产品推荐

