2010-12-29 6 views
16

mam świeżą szyn 3 aplikację, oto moja Gemfile:Delayed_job niewykonanie wykonać metodę ale opróżniania zadanie kolejkę

source 'http://rubygems.org' 
gem 'rails', '3.0.0' gem 'delayed_job' 
gem 'sqlite3-ruby', :require => 'sqlite3' 

Tutaj jest klasa, która reprezentuje pracę, że chcesz stać w kolejce:

class Me < Struct.new(:something) 
    def perform 
    puts "Hello from me" 
    logger.info "Hello from me" 
    logger.debug "Hello from me" 
    raise Exception.new 
    end 
end 

z konsoli bez pracowników uruchomiony:

irb(main):002:0> Delayed::Job.enqueue Me.new(1) 
=> #<Delayed::Backend::ActiveRecord::Job id: 7, priority: 0, attempts: 0, handler: "--- !ruby/struct:Me \nsomething: 1\n", last_error: nil, run_at: "2010-12-29 07:24:11", locked_at: nil, failed_at: nil, locked_by: nil, created_at: "2010-12-29 07:24:11", updated_at: "2010-12-29 07:24:11"> 

Jak wspomniałem: nie ma pracowników prowadzenie:

irb(main):003:0> Delayed::Job.all 
=> [#<Delayed::Backend::ActiveRecord::Job id: 7, priority: 0, attempts: 0, handler: "--- !ruby/struct:Me \nsomething: 1\n", last_error: nil, run_at: "2010-12-29 07:24:11", locked_at: nil, failed_at: nil, locked_by: nil, created_at: "2010-12-29 07:24:11", updated_at: "2010-12-29 07:24:11">] 

zacznę pracownika z script/delayed_job run

Kolejka zostanie opróżniony:

irb(main):006:0> Delayed::Job.all 
=> [] 

Jednak nic nie dzieje się tak w wyniku puts, nic nie jest zalogowany z połączeniami logger, i nie zgłoszono wyjątku. Byłbym wdzięczny za wszelką pomoc/wgląd lub cokolwiek innego.

+0

Mam dokładnie ten sam problem. Czy kiedykolwiek to rozwiązałeś? – Leddo

Odpowiedz

0

prostu kopiowane swoją klasę na IRB i starał się zrobić Me.new.perform:

Hello from me 
NameError: undefined local variable or method `logger' for #<struct Me something=nil> 
from (irb):6:in `perform' 
from (irb):14 

Czy Twoja klasa ma dostęp do rejestratora ''?

Możesz spróbować zrobić coś innego, na przykład otworzyć i napisać do pliku?

File.open("testing.txt", 'w') {|f| f.write("hello") } 

Należy pamiętać, że komenda opóźnionego Praca robotnik w „kładzie” będzie wyjście do jego stdout więc prawdopodobnie nigdy nie zobaczyć. A jeśli chcesz zrobić jakiekolwiek logowanie, myślę, że musisz utworzyć nową instancję Loggera w swojej metodzie wykonania, aby to zrobić.

+0

Próbowałem usunąć wywołania rejestratora i zapisać plik zgodnie z opisem. Nadal widzę to samo zachowanie - zadanie zostanie usunięte z kolejki, ale plik nie zostanie zapisany. – James

0

sprawdzić dzienniki, powinieneś zobaczyć coś o wiadomościach DelayedJob przynajmniej która rozpoczęła pracę i jakie jest jego status wyjścia

w terminalu, uruchomienie:

tail -f log/development.log 

następnie ponowić próbę z konsoli szyn aby sprawdzić, co dzieje się z prostą kwerendą ActiveRecord, a następnie użyć DelayedJob. można przeczytać, co jest rejestrowane na innych terminali

okrzyki, A.

12

Domyślnie delayed_job niszczy nieudanych pracy:

Tak więc pierwszym krokiem jest skonfigurowanie inicjator i wyłączyć to zachowanie

Delayed::Worker.destroy_failed_jobs = false 

Ponadto, jeśli wystąpi błąd deserializacji, oznacza to natychmiastową awarię zadania.

Spowoduje to usunięcie zadania (jeśli go nie usunięto).

Więc spróbuj dodać następujące wokół linii 120 worker.rb

rescue DeserializationError => error 
    say "DeserializationError: #{error.message}" 
    job.last_error = "{#{error.message}\n#{error.backtrace.join('\n')}" 
    failed(job) 

To dość bezużyteczne, ale przynajmniej będziesz wiedział, że to błąd deserializacji wtedy.

Skończyłem właśnie przy użyciu zadania w. Wykonaj metodę method(). O wiele bardziej niezawodny. Pamiętaj także, aby zdefiniować swoją pracę jako osobny plik, aby program ładujący klasy mógł ją znaleźć, gdy jest uruchomiony (zamiast tylko wstawiać definicję klasy do swojego modelu).

6

Ben W jest absolutnie w porządku, Upewnij się, że plik pod

"#{Rails.root}/config/initializers/delayed_job_worker.rb" 

ta określa, w jaki sposób pracownik powinien zachowywać. Pracownik będzie po cichu usuwał błędy w inny sposób.

Gdy to zrobisz, powinieneś być w stanie dowiedzieć się więcej o swoim błędzie. Dla mojego przykładu użyłem delayed_job_mongoid, więc to dodało wpis "last_error" (który myślę, że powinieneś mieć w swoim tablecie mysql dla delayed_job niezależnie od tego ..)

I jak Ben W podsumował, musisz się upewnić obiekt, który tworzysz, jest znany aplikacji (lub pracownikowi). Mój problem polegał na tym, że w Rails Console testowałem obiekt klasy. Pracownik nie znał tej klasy, więc zaprzestano jej.

W moim pliku environment.rb:

module TextSender 
    class Application < Rails::Application 
    require "#{Rails.root.to_s}/lib/SendTextJob.rb" 

i mój lib plik:

class SendTextJob < Struct.new(:text, :number) 
    def perform 
    Rails.logger.info "Sending #{text} to #{number}" 
    puts "Successfully sent text" 
    end 
end 

Następnie uruchomiony

Delayed::Job.enqueue SendTextJob.new("Work on this text NOW, please?", "5551231234") 

zostało potwierdzone w moim dzienniku plików/development.log że to się udało. Przetestowałem także tworzenie i obiekt (obiekt użytkownika lub jakikolwiek model, który możesz mieć) w tej metodzie wykonania i działało.

2

Miałem ten problem i odkryłem, że tak było, ponieważ w Railsach 3 pliki w katalogu lib/ nie są ładowane automatycznie. Aby zdiagnozować, dodałem:

# application.rb 
Delayed::Worker.destroy_failed_jobs = false 

jak wspomniano Ben W. This powiedział mi, co się dzieje, jak mogę sprawdzić last_error.

Tak, aby rozwiązać problem autoloading, znalazłem kilka odpowiedzi na SO, ale sens jest dodanie tego:

# application.rb 

# Custom directories with classes and modules you want to be autoloadable. 
# config.autoload_paths += %W(#{config.root}/extras) 
config.autoload_paths += %W(#{config.root}/lib) 
config.autoload_paths += Dir["#{config.root}/lib/**/"] 

które zostały uzyskane dzięki uprzejmości http://hemju.com/2010/09/22/rails-3-quicktip-autoload-lib-directory-including-all-subdirectories/.

Byłbym zainteresowany, aby zobaczyć, jak rozwiązać ten problem, nie włączając automatycznego ładowania do katalogu lib. jakieś pomysły?

Powiązane problemy