2013-03-22 21 views
6

Mam problem z sidekiq. Zasadniczo dostaję NameError: uninitialized constant na naszej konfiguracji sidekiq, co powoduje, że duża liczba zadań kończy się niepowodzeniem.Błąd Sidekiq Niezainicjowana stała

Dziennik błędów mówi:

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' 

Kod jest tutaj:

# 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 

Blokada jest zdefiniowany w bibliotece:

# 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 

I lib/folder jest automatycznie ładowany z pozostałymi konfiguracjami.

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 

Nie mam pojęcia, dlaczego tak się dzieje. Wydaje się, że zdarza się to częściej, gdy wdrażamy, ale wydaje się, że dzieje się tak często, w przeciwnym razie.

Śledziłem następujący wątek: https://github.com/mperham/sidekiq/issues/331, ale wydaje się, że nie oferuje ono rozwiązania oprócz dodania folderu lib do ścieżek autoload_.

Używam:

gem 'szyny', '3.2.13' gem 'sidekiq', '> = 2.7.5'

Każda pomoc będzie znacznie apreciated.

Odpowiedz

9

Dodaj folder lib do eager_load_paths. Różni się to od autoload_paths. Sidekiq nie będzie ładował klas w locie, dlatego pojawiają się błędy, gdy próbujesz uzyskać dostęp do stałej, która nie była ładnie ładowana.

Więc w environment.rb

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

Dodałem te ścieżki i nadal jestem otrzymuję ten sam błąd dla wszystkich moich zajęć. Jakieś inne rzeczy, które mogłem wypróbować? – kakubei

+0

Otrzymuję teraz ten błąd - @kakubei, rozwiązałeś to? – bodacious

+0

Niestety nie. Musiałem się poddać i przejść do innych rzeczy, ale nigdy go nie rozwiązałem, żadna z porad tutaj dla mnie nie zadziałała :( – kakubei

0

myślę tu problem jest najprawdopodobniej ścieżki obciążenia, jak wspomniano powyżej.

Uwaga - nie jestem pewna opcja autoload_paths jest wymagana jako Rails ignoruje ten poza trybem rozwoju

Zresztą - ja miałem podobny problem: Chociaż mój kod został zaktualizowany, praca cały czas próbowali zadzwonić stary wersje kodu.

W końcu doszedłem do wniosku, że pracujący już byli starsi. I tylko dlatego, że zauważyłem ślad stosu pokazał wersja sidekiq gem był 2.15.0, a ja aktualizowane 2.17.0

Zabiłem inne procesy i to działało dobrze

Powiązane problemy