【问题标题】:NameError: uninitialized constant for sidekiq worker in production but works in developmentNameError:sidekiq 工作人员在生产中的未初始化常量,但在开发中工作
【发布时间】:2018-07-16 22:29:42
【问题描述】:

我正在使用 sidekiq 和 redis 设置后台任务。让它在开发中完全正常工作,但是在登台站点上测试时我得到:

NameError: 未初始化的常量 InviteWorker::User

/controllers/users_controller.rb

class UsersController < ApplicationController

def invite
  params[:user] ? @user = User.where(:referral_code => params[:user])[0] : @user = User.find_by_email(cookies[:h_email])
  user_id = @user.id
  content = params[:body]
  emails = params[:email].split(',')
  total_emails = emails.length
  user_email = @user.email
  referral_code = @user.referral_code
  cloudsponge_emails = params[:count_cloudsponge]
  tracked_count = false
  InviteWorker.perform_async(content, emails, total_emails, user_email, referral_code, cloudsponge_emails, tracked_count, user_id)
  redirect_to :back
end

/app/workers/invite_worker.rb

class InviteWorker
include Sidekiq::Worker

def perform(content, emails, total_emails, user_email, referral_code, cloudsponge_emails, tracked_count, user_id)
  user = User.find(user_id)
  emails.each_with_index do |email,index|
    email = email.gsub(/\s+/, '')
    if email.include? '<'
      email = email.split('<')[1].split('>')[0]
    end
    if User.where(:email => email).empty? && EmailInvite.where('created_at >= ?', Time.now.beginning_of_day).where(:email => email).empty? && User.new.verify_email(email)
      UserMailer.invite_email(content, email, user_email, referral_code).deliver_now
      if index == 0 || tracked_count == false
        EmailInvite.create(:user => user, :email => email, :count => total_emails)
        tracked_count = true
      else
        EmailInvite.create(:user => user, :email => email)
      end
    end
  end
end

end

/config/application.rb

config.autoload_paths += %W(
  #{config.root}/app/workers
  #{config.root}/lib
)

config.eager_load_paths += %W(
  #{config.root}/app/workers
  #{config.root}/lib
)

过程文件

web:     bundle exec puma -C ./config/puma.rb
worker:  bundle exec sidekiq -e $RACK_ENV -r ./config/sidekiq.rb -c ${SIDEKIQ_CONCURRENCY:-5}

编辑 - 提供错误消息:

4 TID-u31nw InviteWorker JID-ea609b6557e45a4d299dcde7 INFO: start 
4 TID-u31nw InviteWorker JID-ea609b6557e45a4d299dcde7 INFO: fail: 0.002 sec 
4 TID-u31nw WARN: {"context":"Job raised exception","job":{"class":"InviteWorker","args":["Hey, join me and sign up!",["email@umd.edu"],1,"email@gmail.com","68QBZ","0",false,2945],"retry":true,"queue":"default","jid":"ea609b6557e45a4d299dcde7","created_at":1531780015.902798,"enqueued_at":1531780015.9035575},"jobstr":"{\"class\":\"InviteWorker\",\"args\":[\"Hey, join me and sign up!\",[\"email@umd.edu\"],1,\"email@gmail.com\",\"68QBZ\",\"0\",false,2945],\"retry\":true,\"queue\":\"default\",\"jid\":\"ea609b6557e45a4d299dcde7\",\"created_at\":1531780015.902798,\"enqueued_at\":1531780015.9035575}"} 
4 TID-u31nw WARN: NameError: uninitialized constant InviteWorker::User 
4 TID-u31nw WARN: /app/app/workers/invite_worker.rb:5:in `perform' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:187:in `execute_job' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:169:in `block (2 levels) in process' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/middleware/chain.rb:128:in `block in invoke' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/middleware/chain.rb:133:in `invoke' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:168:in `block in process' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:139:in `block (6 levels) in dispatch' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/job_retry.rb:98:in `local' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:138:in `block (5 levels) in dispatch' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq.rb:36:in `block in <module:Sidekiq>' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:134:in `block (4 levels) in dispatch' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:199:in `stats' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:129:in `block (3 levels) in dispatch' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/job_logger.rb:8:in `call' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:128:in `block (2 levels) in dispatch' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/job_retry.rb:73:in `global' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:127:in `block in dispatch' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/logging.rb:48:in `with_context' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/logging.rb:42:in `with_job_hash_context' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:126:in `dispatch' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:167:in `process' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:85:in `process_one' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:73:in `run' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/util.rb:16:in `watchdog' 
/app/vendor/bundle/ruby/2.3.0/gems/sidekiq-5.1.3/lib/sidekiq/util.rb:25:in `block in safe_thread'  

【问题讨论】:

  • 你在本地运行什么版本的 ruby​​?在heroku上?错误消息来自哪里(你能分享回溯吗?)。
  • /app 中的所有内容都会自动加载。从您的 config/application.rb 路径中删除 /app/workers。在 Rails 中,编辑任何路径都是一个非常糟糕的主意。
  • @bm5k ruby​​ 2.3.0 在本地和 Heroku 上。在上面的原始帖子中添加了错误消息
  • 我询问了 ruby​​ 版本,因为 ruby​​ 最近改变了顶级常量查找的工作方式。我认为这不适用于 ruby​​ ~> 2.3。你确定那是在heroku上运行的版本吗?无论如何,似乎您的持续查找正在被命名空间。尝试使用::User 来防止命名空间。
  • @MikePerham 我删除了 /app/workers 并更新了 ::User 以防止命名空间问题,现在我刚刚得到:NameError: uninitialized constant User

标签: ruby-on-rails redis sidekiq nameerror


【解决方案1】:

就我而言,我刚刚在生产环境中重新启动了 Sidekiq,它解决了一个问题:sudo service sidekiq restart

【讨论】:

    【解决方案2】:

    在我的情况下,问题在于 application.yml 中 redis 的“命名空间”参数尝试编写它并重新加载 redis、sidekiq 和服务器

    redis: 网址:redis://localhost:6379/1 命名空间:“some_namespace_name”

    【讨论】:

      【解决方案3】:

      它与 eager_load 或 autoload 路径无关。如果您使用 puma 和许多工人,那么您需要在 config/puma.rb 中的工人编号下方调用这些

      workers 2
      preload_app! #used when workers are more than 0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-29
        • 2012-03-17
        • 2021-10-09
        • 1970-01-01
        相关资源
        最近更新 更多