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?
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.
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.
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.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With