2010-09-08 16 views
7
Ben Heroku üzerinde delayed_job kullanmaya çalışıyorum

üzerine delayed_job ve aşağıdaki hatayı alıyorum:gerçekleştirmek yanıt vermeyen öğeleri enqueue Can - Heroku

Cannot enqueue items which do not respond to perform 

Ben eklenti http://github.com/pedro/delayed_job

kullanıyorum aşağıdaki cron tırmık görevi (cron.rake) kullanıyorum:

:

task :cron => :environment do 
require 'heroku'  
    puts "starting the cron job at #{Date.today}" 

    heroku = Heroku::Client.new(ENV['HEROKU_USER'], ENV['HEROKU_PASS']) 
    heroku.set_workers(ENV['HEROKU_APP'], 1) 

    Contact.all.each do |contact| 
     email = contact.email_today #email_today is a contact method returning email object if <= today 

     unless contact.email_today == "none" 
     puts contact.first_name 
     puts email.days 
     puts contact.date_entered 
     puts email.substituted_subject(contact,contact.colleagues) 

     # create the Contact Email object that gets created and sent 

     contact_email = ContactEmail.new 
     contact_email.contact_id = contact.id 
     contact_email.email_id = email.id 

     contact_email.subject = email.substituted_subject(contact,contact.colleagues) 
     contact_email.date_sent = Date.today 
     contact_email.date_created = Date.today 

     contact_email.body = email.substituted_message(contact, contact.colleagues) 

     contact_email.status = "sent" 

     Delayed::Job.enqueue OutboundMailer.deliver_campaign_email(contact,contact_email) 

     contact_email.save #now save the record 
     puts "save contact_email:" 
     puts contact_email.inspect 

     end #end unless 

    end #end do 

    heroku.set_workers(ENV['HEROKU_APP'], 0) 
    puts "set heroku workers to 0" 

end 

Bu kullanıyorum mailler

class OutboundMailer < Postage::Mailer 

    def campaign_email(contact,email) 
    subject email.subject 
    recipients contact.email 
    from  'Me <[email protected]>' 
    sent_on Date.today 

    body  :email => email 
    end 

Soru: Neden hatayı alıyorum ve çözmek için ne yapabilirim?

cevap

10

Bir iş, aşağıda böyle bir iş nesnesi oluşturmak zorunda kalacak genellikle bir yönteme böylece mailler çalışmaz teslim enqueuing, "gerçekleştirmek" ile yakut nesnesidir,

 
class SomeMailJob < Struct.new(:contact, :contact_email) 
    def perform 
    OutboundMailer.deliver_campaign_email(contact,contact_email) 
    end 
end 

bir dosya oluşturun some_mail_job.rb ve koyun bu/lib

ve yukarıdaki kodda

,

Delayed::Job.enqueue SomeMailJob.new(contact,contact_email)

ile enqueue deyimi yerine Bilginize

OutboundMailer.delay.deliver_campaign_email(contact,contact_email) 

delay sizin delayed_job şube ve sürümüne bağlı olarak send_later çağrılacak kullandı: Eğer Gecikmeli :: Job.enqueue ilişkin diğer seçenekleri geçmesi gerekiyor yoksa

+0

Ayrıca, http://github.com/pedro/delayed_job belgesini okuyun. onun tüm orada –

+0

Merhaba, yapacak - Okumam ama başkasının SO yüzden açıklanan emin değildi olarak bunu yapmak için söyledi .... yaklaşımınız çok nettir, teşekkürler. – Angela

2

, o zaman bu daha basit bir çözüm .

+0

Aynı zamanda işçilerle de kahramanlık üzerinde çalışıyor mu? – Angela

+0

Yani gecikmiş kullanarak ile cron olarak kullanmak: iş enque tamamen? – Angela

+0

Bu kendi SomeMailJob oluşturma ve 'Gecikmiş :: Job.enqueue' için bunun bir örneğini gönderme ile ilgili alternatif (kısa) sözdizimi. Hepsi bu. Heroku üzerinde kullanmak için, bir mücevher veya eklenti olarak uygulamanıza delayed_job yüklemeniz gerekir, ama hepsi olmalıdır. – tfe