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

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方法。

解决方案建议

  1. 升级Rails到5.2.x正式稳定版本,避免预发布版本的兼容性问题。
  2. 锁定sidekiq-cron到最新稳定版,例如gem "sidekiq-cron", "~> 1.15.0",执行bundle update sidekiq-cron更新依赖。
  3. 检查Worker定义,确保ActiveJob Worker仅继承ApplicationJob,Sidekiq原生Worker仅继承Sidekiq::Worker,不要混合继承。
  4. 验证sidekiq-cron的任务配置,确认class字段指定的是正确的ActiveJob类名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:39:51