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

为何无法将Sidekiq.configure_server包裹在Rails after_initialize中?

Rails 6 升级后 Sidekiq 自动加载弃用警告及任务异常的解决办法

问题根源

Rails 6 切换到 Zeitwerk 自动加载器后,原有的 ActionDispatch::Reloader 类方法调用逻辑失效,且错误地将全部 Sidekiq 配置包裹进 after_initialize 会打乱 Sidekiq 服务器的初始化流程,导致任务无法被处理。

具体修复方案

  1. 修正开发环境重载器代码
    替换报错的重载器配置,Rails 6+ 中 ActionDispatch::Reloader 需要通过实例调用,它会自动处理 cleanup! 和 prepare! 流程:

    if Rails.env.development?
      Sidekiq.options[:reloader] = proc do |&block|
        ActionDispatch::Reloader.new.call do
          block.call
        end
      end
    end
    
  2. 合理拆分配置包裹范围
    不要将所有 Sidekiq 配置都塞进 after_initialize,仅把依赖 Rails 应用常量(如模型、路由)的部分放在其中,核心配置直接放在初始化器顶层:

    # 核心Sidekiq配置直接放在初始化器顶层
    if Rails.env.development?
      Sidekiq.options[:reloader] = proc do |&block|
        ActionDispatch::Reloader.new.call do
          block.call
        end
      end
    end
    
    # 依赖Rails应用常量的服务器配置包裹在after_initialize中
    Rails.application.config.after_initialize do
      Sidekiq.configure_server do |config|
        config.redis = { url: ENV['REDIS_URL'] }
        # 其他需要调用Rails模型/常量的配置逻辑
      end
    end
    
    # 客户端配置直接放在顶层即可
    Sidekiq.configure_client do |config|
      config.redis = { url: ENV['REDIS_URL'] }
    end
    
  3. 验证配置有效性
    调整后可启动 Sidekiq 服务器,检查是否仍有自动加载警告,同时确认任务队列能正常消费。开发环境需确保 config/environments/development.rb 中 config.cache_classes 保持默认的 false,以保证自动加载机制正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:32:33