2010-09-08 23 views
7

Tôi cố gắng để sử dụng delayed_job trên Heroku và tôi nhận được lỗi sau:Không thể enqueue mục mà không đáp ứng với thực hiện - delayed_job trên Heroku

Cannot enqueue items which do not respond to perform 

Tôi đang sử dụng plugin http://github.com/pedro/delayed_job

tôi đang sử dụng các nhiệm vụ sau đây cron cào (cron.rake):

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 

Đây là bưu phẩm tôi đang sử dụng:

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 

Câu hỏi: Tại sao tôi gặp lỗi và tôi có thể làm gì để giải quyết vấn đề này?

Trả lời

10

Một công việc thường là một đối tượng ruby ​​với một phương pháp "thực hiện", do đó enqueuing một bưu phẩm cung cấp sẽ không làm việc, bạn sẽ phải tạo một đối tượng công việc như thế này dưới đây,

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

Tạo một file some_mail_job.rb và đặt này trong/lib

trong mã trên, thay thế báo cáo kết quả enqueue với

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

+0

cũng có thể đọc tài liệu http://github.com/pedro/delayed_job. của nó tất cả có –

+0

Hi, sẽ làm - Tôi đọc nó nhưng một người nào khác trên SO nói để làm điều đó như mô tả như vậy là không chắc chắn .... cách tiếp cận của bạn là rất rõ ràng hơn, cảm ơn. – Angela

2

Nếu bạn không cần phải vượt qua tùy chọn khác để trì hoãn :: Job.enqueue, thì đây là một giải pháp đơn giản hơn:

OutboundMailer.delay.deliver_campaign_email(contact,contact_email) 

FYI delay thường được gọi là send_later, tùy thuộc vào chi nhánh delayed_job của bạn và phiên bản .

+0

Thsi cũng làm việc trên heroku với công nhân giống như là? – Angela

+0

Vì vậy, tôi sử dụng này như là cron với việc sử dụng bị trì hoãn: công việc enque hoàn toàn? – Angela

+0

Đây là một cú pháp thay thế (ngắn hơn) để tạo SomeMailJob của riêng bạn và gửi một thể hiện của nó đến 'Delayed :: Job.enqueue'. Đó là tất cả. Để sử dụng nó trên Heroku, bạn cần phải cài đặt delay_job vào ứng dụng của bạn dưới dạng đá quý hoặc plugin, nhưng đó là tất cả. – tfe

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