2013-03-22 33 views
6

Tôi đang gặp vấn đề với sidekiq. Về cơ bản chúng tôi đang nhận được NameError: uninitialized constant trên thiết lập sidekiq của chúng tôi đang gây ra một số lượng lớn công việc thất bại.Lỗi Sidekiq Uninitialized Constant

Nhật ký lỗi nói:

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' 

Mã này là ở đây:

# 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 

Khóa được định nghĩa trong thư viện:

# 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 

Và lib/thư mục sẽ tự động được tải với các cấu hình còn lại.

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 

Tôi không biết tại sao điều này lại xảy ra. Dường như điều này xảy ra thường xuyên hơn khi chúng tôi triển khai, nhưng dường như điều đó xảy ra thường xuyên nếu không.

Tôi đã theo dõi chuỗi sau: https://github.com/mperham/sidekiq/issues/331 nhưng dường như không cung cấp giải pháp ngoài việc thêm thư mục lib vào autoload_paths.

Tôi đang sử dụng:

đá quý 'đường ray', '3.2.13' đá quý 'sidekiq', '> = 2.7.5'

Bất kỳ trợ giúp sẽ được apreciated rất nhiều.

Trả lời

9

Thêm thư mục lib vào eager_load_paths. Điều này khác với số autoload_paths. Sidekiq sẽ không tải các lớp học trên bay, đó là lý do tại sao bạn nhận được lỗi khi bạn cố gắng truy cập một hằng số mà không được tải háo hức.

Vì vậy, trong application.rb bạn

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

Tôi đã thêm các đường dẫn và vẫn còn nhận được cùng một lỗi cho tất cả các lớp học của tôi. Tôi có thể thử những thứ khác không? – kakubei

+0

Tôi nhận được lỗi này ngay bây giờ - @kakubei, bạn đã giải quyết vấn đề này chưa? – bodacious

+0

Thật không may là không. Tôi đã phải từ bỏ và chuyển sang những thứ khác, nhưng không bao giờ giải quyết nó, không có lời khuyên nào ở đây làm việc cho tôi: ( – kakubei

0

Tôi nghĩ vấn đề ở đây rất có thể là các đường dẫn tải như đã đề cập ở trên.

Lưu ý - Tôi không chắc tùy chọn autoload_paths được yêu cầu như Rails lờ bên ngoài này của chế độ phát triển

Dù sao - Tôi đã có một vấn đề tương tự: Mặc dù mã của tôi đã được cập nhật, công việc tiếp tục cố gắng để gọi cũ các phiên bản của mã.

Tôi cuối cùng đã tìm ra rằng có những công nhân đang hoạt động cũ. Tôi chỉ nhận thấy vì stack trace cho thấy phiên bản sidekiq đá quý là 2.15.0, và tôi đã cập nhật 2.17.0

tôi giết các quá trình khác và nó làm việc tốt

Các vấn đề liên quan