Sidekiq从5升级到6后sidekiq-cron任务无法入队报错
Sidekiq升级至6版本后sidekiq-cron任务无法入队的问题分析
问题背景
将Sidekiq从5版本升级至6版本后,所有sidekiq-cron任务无法入队,报错提示找不到ActiveJob的perform_later方法。
使用的Gem版本
ruby '2.7.8' gem 'rails', '~> 5.2.0.beta2' gem 'sidekiq', '~> 6.5.9' gem "sidekiq-cron", '>= 1.12.0'
报错信息
pid=2 tid=295q ERROR: CRON JOB: undefined method `perform_later' for #<Sidekiq::Worker::Setter:0x00007fd1af1929f8> 2024-03-01T15:40:01.664863+00:00 app[worker.1]: Did you mean? perform_at 2024-03-01T15:40:01.664865+00:00 app[worker.1]: pid=2 tid=295q ERROR: CRON JOB: /app/vendor/bundle/ruby/2.7.0/gems/sidekiq-cron-1.12.0/lib/sidekiq/cron/job.rb:98:in `enqueue_active_job' 2024-03-01T15:40:01.664865+00:00 app[worker.1]: pid=2 tid=295q WARN: NoMethodError: undefined method `perform_later' for #<Sidekiq::Worker::Setter:0x00007fd1af1929f8> 2024-03-01T15:40:01.664865+00:00 app[worker.1]: Did you mean? perform_at 2024-03-01T15:40:01.664866+00:00 app[worker.1]: pid=2 tid=295q WARN: /app/vendor/bundle/ruby/2.7.0/gems/sidekiq-cron-1.12.0/lib/sidekiq/cron/job.rb:98:in `enqueue_active_job' 2024-03-01T15:40:01.664867+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.7.0/gems/sidekiq-cron-1.12.0/lib/sidekiq/cron/job.rb:65:in `enque!' 2024-03-01T15:40:01.664868+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.7.0/gems/sidekiq-cron-1.12.0/lib/sidekiq/cron/job.rb:45:in `test_and_enque_for_time!' 2024-03-01T15:40:01.664868+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.7.0/gems/sidekiq-cron-1.12.0/lib/sidekiq/cron/poller.rb:36:in `enqueue_job' 2024-03-01T15:40:01.664869+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.7.0/gems/sidekiq-cron-1.12.0/lib/sidekiq/cron/poller.rb:23:in `block in enqueue' 2024-03-01T15:40:01.664869+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.7.0/gems/sidekiq-cron-1.12.0/lib/sidekiq/cron/poller.rb:22:in `each' 2024-03-01T15:40:01.664870+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.7.0/gems/sidekiq-cron-1.12.0/lib/sidekiq/cron/poller.rb:22:in `enqueue' 2024-03-01T15:40:01.664870+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.7.0/gems/sidekiq-6.5.12/lib/sidekiq/scheduled.rb:100:in `block in start' 2024-03-01T15:40:01.664870+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.7.0/gems/sidekiq-6.5.12/lib/sidekiq/component.rb:8:in `watchdog' 2024-03-01T15:40:01.664870+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.7.0/gems/sidekiq-6.5.12/lib/sidekiq/component.rb:17:in `block in safe_thread' 2024-03-01T15:40:01.664871+00:00 app[worker.1]: D, [2024-03-01T15:40:01.663634 #2] DEBUG -- : undefined method `perform_later' for #<Sidekiq::Worker::Setter:0x00007fd1af1929f8> 2024-03-01T15:40:01.664872+00:00 app[worker.1]: Did you mean? perform_at excluded from capture: DSN not set
原因分析
Sidekiq与sidekiq-cron的ActiveJob兼容逻辑冲突
Sidekiq 6.x对ActiveJob的集成方式做了调整,sidekiq-cron 1.12.0的enqueue_active_job方法中,错误地将Sidekiq Worker的Setter对象识别为ActiveJob类并调用perform_later。该Setter实例只有Sidekiq原生的perform_at等方法,没有ActiveJob的perform_later,因此触发报错。Rails预发布版本的兼容性问题
使用的Rails 5.2.0.beta2是预发布版本,与Sidekiq 6.x的ActiveJob集成可能存在未修复的API差异,导致sidekiq-cron无法正确识别ActiveJob类的类型。sidekiq-cron版本适配不足
指定的sidekiq-cron >=1.12.0版本可能未完全适配Sidekiq 6.x的所有变更,部分兼容逻辑未同步更新。Worker定义混淆
如果你的Worker同时继承Sidekiq::Worker和ApplicationJob,Sidekiq升级后,sidekiq-cron无法正确识别Worker类型,会错误地用Sidekiq Worker的调用方式去执行ActiveJob方法。
解决方案建议
- 升级Rails到5.2.x正式稳定版本,避免预发布版本的兼容性问题。
- 锁定sidekiq-cron到最新稳定版,例如
gem "sidekiq-cron", "~> 1.15.0",执行bundle update sidekiq-cron更新依赖。 - 检查Worker定义,确保ActiveJob Worker仅继承
ApplicationJob,Sidekiq原生Worker仅继承Sidekiq::Worker,不要混合继承。 - 验证sidekiq-cron的任务配置,确认
class字段指定的是正确的ActiveJob类名。
内容的提问来源于stack exchange,提问作者Ladybro
相关产品推荐
相关产品推荐

