2013-03-22 174 views
6

我在与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' 

的代码是在这里:

# 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 

锁在一个库中定义:

# 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 

而下的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 

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

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

我使用:

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

任何帮助将大大apreciated。

回答

9

lib文件夹添加到eager_load_paths。这与autoload_paths不同。 Sidekiq不会随时加载类,这就是为什么当您尝试访问未被加载的常量时出现错误的原因。

所以在你application.rb中

config.autoload_paths += %W(#{config.root}/lib) 
config.eager_load_paths += %W(#{config.root}/lib) 
+0

我已经添加了这些路径和我仍然为我所有的课程获得相同的错误。任何其他的事情,我可以尝试? – kakubei 2013-05-29 13:03:52

+0

我现在得到这个错误 - @kakubei,你解决了这个问题吗? – bodacious 2013-12-13 14:27:30

+0

不幸的是没有。我不得不放弃并转移到其他的东西,但从来没有解决它,这里没有任何提示为我工作:( – kakubei 2013-12-14 12:55:15

0

我觉得这里的问题是最有可能的负载路径如上所述。

注 - 我不知道该autoload_paths选项是必需的Rails的忽略这个发展模式之外

反正 - 我有一个类似的问题:虽然我的代码进行了更新,该工作一直在试图拨打老代码版本。

我终于搞清楚了,那里有老员工跑步。我只注意到,因为堆栈跟踪显示sidekiq宝石版本是2.15.0,我会更新2.17.0

我杀了其他进程和它工作得很好

相关问题