我遇到了sidekiq的问题。基本上我们在sidekiq设置上得到NameError: uninitialized constant
,导致大量作业失败。
错误日志显示:
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之外,它似乎没有提供解决方案。
我正在使用:
gem'rail','3.2.13' gem'sidekiq','&gt; = 2.7.5'
任何帮助都会有很大帮助。
答案 0 :(得分: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)
答案 1 :(得分:0)
我认为这里的问题很可能是上面提到的负载路径。
注意 - 我不确定是否需要autoload_paths选项,因为Rails在开发模式之外忽略了这个选项
无论如何 - 我遇到了类似的问题:虽然我的代码已更新,但该作业仍在尝试调用旧版本的代码。
我最终发现,有些工人跑步了。我只注意到因为堆栈跟踪显示sidekiq gem版本是2.15.0,我更新了2.17.0
我杀死了其他进程并且运行正常