Sidekiq-Cron新增FedexGroundCloseWorker生产环境报NameError问题
生产环境sidekiq-cron任务异常排查与解决
问题背景
使用sidekiq-cron调度后台任务,配置文件为config/schedule.yml,加载逻辑位于config/initializers/sidekiq.rb。其他任务运行正常,但新增的ground_close任务(对应FedexGroundCloseWorker)仅在生产环境出现两种异常:
- 报错
NameError: uninitialized constant FedexGroundCloseWorker - 有时任务显示启动但无实际执行动作
该任务在staging环境运行正常,版本信息:Ruby 2.1.2、Rails 4.1.1、sidekiq 4.1.2、sidekiq-cron 0.4.3。
排查与解决方案
1. 验证Worker文件与命名规范
Rails 4.x的类自动加载依赖严格的文件名与类名映射,需确保:
- Worker文件路径为
app/workers/fedex_ground_close_worker.rb(下划线命名对应类名的驼峰命名),且生产环境部署后该文件存在,无拼写/大小写错误。 - 文件内类定义正确:
class FedexGroundCloseWorker include Sidekiq::Worker def perform # 业务逻辑代码 end end
2. 强制预加载Worker类
生产环境默认开启config.cache_classes = true,自动加载机制关闭,可能导致sidekiq启动时未加载新增Worker。在config/initializers/sidekiq.rb中添加手动加载逻辑:
# 方式1:单独加载目标Worker require Rails.root.join('app/workers/fedex_ground_close_worker') # 方式2:批量加载所有Worker(适合新增多个Worker的场景) Dir[Rails.root.join('app/workers/**/*.rb')].each { |file| require file }
3. 确认部署后重启sidekiq进程
旧的sidekiq进程不会自动加载新部署的代码,需确保:
- 每次部署后手动重启sidekiq(根据进程管理工具调整命令,如
RAILS_ENV=production sidekiq restart) - 若使用Capistrano部署,需在部署脚本中添加sidekiq重启步骤:
after 'deploy:published', 'sidekiq:restart'
4. 检查sidekiq-cron配置正确性
- 验证
config/schedule.yml中ground_close任务的类名无拼写错误:ground_close: cron: "30 8 * * *" # 你的定时规则 class: "FedexGroundCloseWorker" queue: default args: [] - 确认
config/initializers/sidekiq.rb中sidekiq-cron的加载逻辑正确:schedule_file = Rails.root.join('config/schedule.yml') if File.exist?(schedule_file) && Sidekiq.server? Sidekiq::Cron::Job.load_from_hash YAML.load_file(schedule_file) end
5. 排查“任务启动但无执行”问题
- 在Worker的
perform方法开头添加日志,确认是否进入执行逻辑:def perform Sidekiq.logger.info "[FedexGroundCloseWorker] 开始执行任务" # 原有业务逻辑 Sidekiq.logger.info "[FedexGroundCloseWorker] 任务执行完成" end - 检查生产环境sidekiq日志级别配置,确保info级日志未被过滤。
- 排查业务逻辑中是否存在生产环境特有的分支判断(如仅在非生产环境执行),或依赖的配置项在生产环境未正确设置。
内容的提问来源于stack exchange,提问作者Tanveer Ahmad Khan
相关产品推荐
相关产品推荐

