2010-12-29 15 views
16

खाली मैं एक ताजा रेल 3 एप्लिकेशन है, यहाँ मेरी Gemfile है:Delayed_job क्रियान्वित नहीं विधि है लेकिन काम कतार

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

यहाँ वर्ग कि काम है कि मैं क़तार में चाहते का प्रतिनिधित्व करता है:

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 

कोई कार्यकर्ताओं के साथ कंसोल से चल रहा है:

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"> 

जैसे कि मैंने उल्लेख किया है: कोई कार्यकर्ता हैं चल रहा है:

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">] 

मैं script/delayed_job run

साथ एक कार्यकर्ता कतार खाली कर दिया जाता है शुरू:

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

हालांकि, कुछ भी नहीं puts का एक परिणाम के रूप में होता है, कुछ भी नहीं logger कॉल से लॉग ऑन है, और कोई अपवाद नहीं उठाया गया है। मैं कोशिश करने के लिए किसी भी मदद/अंतर्दृष्टि या कुछ भी सराहना करता हूं।

+0

मुझे बिल्कुल वही समस्या मिली है। क्या आपको कभी इसका समाधान प्राप्त हुआ था? – Leddo

उत्तर

0

मैं सिर्फ आईआरबी में अपने वर्ग की नकल की और 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 

अपने वर्ग 'लकड़हारा' के लिए उपयोग किया जाता है?

आप कुछ और करने की कोशिश कर सकते हैं, जैसे फ़ाइल खोलना और लिखना?

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

भालू है कि देरी नौकरी कार्यकर्ता 'कहते हैं' कमांड अपने stdout में उत्पादन तो आप शायद इस कभी नहीं देखेंगे होगा। और अगर आप किसी भी प्रवेश करना चाहते हैं, मुझे लगता है कि आप ऐसा करने के लिए में अपने प्रदर्शन विधि के भीतर एक नया लॉगर उदाहरण बनाना होगा।

+0

मैंने आपके द्वारा वर्णित लॉगजर कॉल को हटाने और फ़ाइल लिखने का प्रयास किया। मैं अभी भी वही व्यवहार देख रहा हूं - नौकरी कतार से हटा दी जाती है लेकिन फ़ाइल लिखी नहीं जाती है। – James

0

delayed_job का कौन-सा संस्करण चल रहे हैं?

आपको रेल 3.0 और उसके बाद के लिए 2.पर 2.1 शाखा की आवश्यकता है।

+0

हां यह मास्टर शाखा है जो मुझे विश्वास है 2.1 है – James

0

जाँच लॉग, आप DelayedJob संदेशों के बारे में कुछ देखना चाहिए, कम से कम जो काम शुरू की है और उसके बाहर निकलने का दर्जा

, लांच एक टर्मिनल में क्या करना है:

tail -f log/development.log 

तो एक रेल कंसोल से पुन: प्रयास यह जांचने के लिए कि एक सरल ActiveRecord क्वेरी क्या होता है, फिर DelayedJob का उपयोग करना। आप पढ़ सकते हैं क्या दूसरे टर्मिनल

चियर्स पर लॉग ऑन है, ए

12

डिफ़ॉल्ट रूप से, delayed_job में विफल रहा है रोजगार को नष्ट कर:

तो पहला कदम एक प्रारंभकर्ता कॉन्फ़िगर और उस व्यवहार को निष्क्रिय करने के लिए है

Delayed::Worker.destroy_failed_jobs = false 

इसके अलावा, अगर आपको एक deserialization विफलता मिलती है, तो यह एक त्वरित नौकरी विफलता है।

यह जॉब हटाना ट्रिगर करता है (यदि आपने इसे हटाया नहीं है)।

तो worker.rb

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

की लाइन 120 के आसपास निम्नलिखित जोड़ने की कोशिश यह काफी बेकार है, लेकिन कम से कम आप इसे एक अक्रमांकन त्रुटि है तो पता चल जाएगा।

मैं केवल नौकरी डब्ल्यू का उपयोग कर समाप्त हुआ। प्रदर्शन() विधि निर्माण। अधिक विश्वसनीय। अपनी नौकरी परिभाषा को एक अलग फ़ाइल के रूप में रखना भी याद रखें ताकि क्लास लोडर इसे चलने पर ढूंढ सके (केवल आपके मॉडल में कक्षा परिभाषा को रेखांकित करने के बजाय)।

6

बेन डब्ल्यू बिल्कुल सही, के तहत

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

यह परिभाषित करता है कि कार्यकर्ता व्यवहार करना चाहिए सुनिश्चित करें कि आप एक फाइल किया है है। कार्यकर्ता चुपचाप त्रुटियों को हटाने के लिए जा रहा है अन्यथा।

एक बार ऐसा करने के बाद, आपको अपनी त्रुटि के बारे में अधिक जानकारी प्राप्त करने में सक्षम होना चाहिए। मेरे उदाहरण के लिए, मैं delayed_job_mongoid का उपयोग कर रहा था, इसलिए इसने "last_error" का एक प्रविष्टि जोड़ा (जो मुझे लगता है कि आपको देरी_बॉइस के लिए आपकी mysql तालिका में होना चाहिए ..)

और जैसा कि बेन डब्ल्यू ने निष्कर्ष निकाला, आपको यह सुनिश्चित करना होगा जिस वस्तु को आप बना रहे हैं वह एप्लिकेशन (या उस मामले के लिए कार्यकर्ता को) के लिए जाना जाता है। मेरी समस्या यह थी कि मैं क्लास ऑब्जेक्ट में रेल कंसोल परीक्षण में था। कार्यकर्ता को इस वर्ग के बारे में पता नहीं था, इसलिए यह बार्फ़ किया गया।

मेरी application.rb फ़ाइल में:

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

और मेरे lib फ़ाइल:

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

फिर

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

चल मेरी लॉग/development.log फ़ाइल में तय हो गया कि यह सफल रहा था। मैंने इस प्रदर्शन विधि में बनाने और ऑब्जेक्ट (उपयोगकर्ता ऑब्जेक्ट या जो भी मॉडल हो सकता है) का परीक्षण किया, और यह काम किया।

2

मुझे यह समस्या थी, और मैंने पाया कि ऐसा इसलिए था क्योंकि lib/ निर्देशिका में रेल 3 फ़ाइलों में स्वत: लोड नहीं किया गया है। का निदान करने के लिए, मैं कहा:

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

के रूप में बेन डब्ल्यू यह द्वारा उल्लेख किया है, मुझे बताया था कि क्या हो रहा था के रूप में मैं last_error का निरीक्षण कर सकते हैं।

तो autoloading समस्या को हल करने, मैं एक जोड़े को जवाब इतने पर मिल गया, लेकिन सार यह जोड़ रहा है:

# 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/**/"] 

कौन सा कृपया http://hemju.com/2010/09/22/rails-3-quicktip-autoload-lib-directory-including-all-subdirectories/ द्वारा प्रदान किया गया।

मुझे यह देखने में दिलचस्पी होगी कि आप lib निर्देशिका के लिए स्वत: लोडिंग को चालू किए बिना इसे कैसे हल कर सकते हैं। कोई विचार?

संबंधित मुद्दे