Sidekiq错误未初始化常量

rol*_*usa 7 ruby-on-rails-3 sidekiq

我和sidekiq有问题.基本上我们NameError: uninitialized constant正在进行我们的sidekiq设置,导致大量作业失败.

错误日志说:

NameError: uninitialized constant GameUser::Lock
/data/@myapp/releases/20130321230952/app/models/game_user.rb:71:in `node_calls_base_get_user'
/data/@myapp/shared/bundled_gems/ruby/1.9.1/gems/sidekiq-2.8.0/lib/sidekiq/processor.rb:45:in `block (3 levels) in process'
/data/@myapp/shared/bundled_gems/ruby/1.9.1/gems/sidekiq-2.8.0/lib/sidekiq/middleware/chain.rb:109:in `call'
Run Code Online (Sandbox Code Playgroud)

代码在这里:

# app/models/game_user.rb
def self.node_calls_base_get_user(serial, game_name)
  if Lock.get("user:#{id}") # Set up lock to prevent multiple users to be created      
    Lock.delete("user:#{id}")
  end
  return false
end
Run Code Online (Sandbox Code Playgroud)

锁定在库中定义:

# lib/lock.rb
class Lock
  def self.get(key)
    lock = CACHE.add("lock:#{key}", 1, 5) # Let lock autoexpire after 5 seconds
    return true
  end
end
Run Code Online (Sandbox Code Playgroud)

并且lib /文件夹会自动加载其余配置.

module Myapp
  class Application < Rails::Application
    ...
    # Custom directories with classes and modules you want to be autoloadable.
    config.autoload_paths += %W(#{config.root}/lib)
    ...    
  end
end
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会这样.我们部署时似乎更频繁地发生,但似乎经常发生这种情况.

我一直在关注以下主题:https://github.com/mperham/sidekiq/issues/331但除了将lib文件夹添加到autoload_paths之外,它似乎没有提供解决方案.

我正在使用:

宝石'轨道','3.2.13'宝石'sidekiq','> = 2.7.5'

任何帮助都会大大减少.

Chr*_*son 10

lib文件夹添加到eager_load_paths.这是不同的autoload_paths.Sidekiq不会动态加载类,这就是当您尝试访问未加载的常量时出现错误的原因.

所以在你的application.rb中

config.autoload_paths += %W(#{config.root}/lib)
config.eager_load_paths += %W(#{config.root}/lib)
Run Code Online (Sandbox Code Playgroud)