Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot enqueue items which do not respond to perform -- delayed_job on heroku

I am trying to use delayed_job on heroku and I get the following error:

Cannot enqueue items which do not respond to perform

I am using the plugin http://github.com/pedro/delayed_job

I am using the following cron rake task (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

This is the mailer I am using:

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

Question: Why am I getting the error and what can I do to solve it?

like image 421
Satchel Avatar asked Sep 08 '10 05:09

Satchel


People also ask

What are Delayed jobs?

Delayed Job, also known as DJ, makes it easy to add background tasks to your Rails applications on Heroku. You can also use Resque and many other popular background queueing libraries. Delayed Job uses your database as a queue to process background jobs.

How do I know if my job is running late?

The most simple way to check whether delayed_job is running or not, is to check at locked_by field. This field will contain the worker or process locking/processing the job. Running Delayed::Job. where('locked_by is not null') will give you some results, if there are jobs running.

How does Delayed Job work?

Delayed::Job works by serializing a Ruby object as YAML and storing it in a database table so that a worker in a different process can retrieve, deserialize, and perform the requested work. Some operations that we use Delayed::Job for are longer-running data processing, sending emails, and updating search indicies.


1 Answers

A job is usually a ruby object with a method "perform", thus enqueuing a mailer deliver will not work, you will have to create a job object like this below,

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

Create a file some_mail_job.rb and place this in /lib

and

in above code, replace the enqueue statement with

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

like image 96
Rishav Rastogi Avatar answered Sep 22 '22 17:09

Rishav Rastogi