2010-09-08 26 views
7

Estoy tratando de utilizar delayed_job en heroku y me sale el siguiente error:No se puede poner en cola los elementos que no responden a realizar - delayed_job en heroku

Cannot enqueue items which do not respond to perform 

estoy usando el plugin http://github.com/pedro/delayed_job

I estoy usando la tarea cron siguiente rastrillo (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 

Este es el programa de correo que estoy utilizando:

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 

Pregunta: ¿Por qué me sale el error y qué puedo hacer para solucionarlo?

Respuesta

10

un trabajo es por lo general un objeto de rubí con un método de "realizar", enqueuing tanto, un anuncio publicitario de entregar no funciona, tendrá que crear un objeto de trabajo como este continuación,

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

Crear un archivo some_mail_job.rb y colocar esto en/lib

y

en el código anterior, reemplace la declaración de puesta en cola con

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

+0

también, lea la documentación http://github.com/pedro/delayed_job. está todo allí –

+0

Hola, haré - Lo leí, pero alguien más en SO dijo que lo hiciera como se describe, así que no estaba seguro ... tu enfoque es mucho más claro, gracias. – Angela

2

Si no necesita pasar a otras opciones retardada :: Job.enqueue, entonces esta es una solución más simple:

OutboundMailer.delay.deliver_campaign_email(contact,contact_email) 

FYI delay que antes se llamaba send_later, dependiendo de su rama delayed_job y la versión .

+0

¿Esto también funciona en heroku con los trabajadores tal como es? – Angela

+0

Entonces uso esto como el cron con el uso de la demora: job enque por completo? – Angela

+0

Esta es una sintaxis alternativa (más corta) al crear su propio SomeMailJob y enviar una instancia del mismo a 'Delayed :: Job.enqueue'. Eso es todo. Para usarlo en Heroku, necesitas instalar el trabajo demorado en tu aplicación como una gema o complemento, pero eso debería ser todo. – tfe

Cuestiones relacionadas