Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

delayed_job. Delete job from queue

class Radar
 include Mongoid::Document
 after_save :post_on_facebook

 private

 def post_on_facebook
  if self.user.settings.post_facebook
    Delayed::Job.enqueue(::FacebookJob.new(self.user,self.body,url,self.title),0,self.active_from)
  end
 end

end

class FacebookJob < Struct.new(:user,:body,:url,:title)
  include SocialPluginsHelper

  def perform
    facebook_client(user).publish_feed('', :message => body, :link => url, :name => title)
  end
end

I want execute post_on_facebook method at specific date. I store this date at "active_from" field.

Code above is working and job is executed at correct date.

But in some cases I first create Radar object and send some job to Delayed Job queue. After that I update this object and send another job to Delayed Job.

This is wrong behavior because I wan't execute job only once at correct time. In this implementation I will have 2 jobs which will be executed. How I can delete previous job so only updated one will be executed ?

Rails 3.0.7
Delayed Job => 2.1.4 https://github.com/collectiveidea/delayed_job

ps: sorry for my english I try do my best

like image 941
Lewy Avatar asked May 16 '11 19:05

Lewy


2 Answers

Sounds like you want to de-queue any jobs if a radar object gets updated and re-queue.

Delayed::Job.enqueue should return a Delayed::Job record, so you can grab the ID off of that and save it back onto the Radar record (create a field for it on radar document) so you can find it again later easily.

You should change it to a before_save so you don't enter an infinite loop of saving.

before_save :post_on_facebook

def post_on_facebook
  if self.user.settings.post_facebook && self.valid?

    # delete existing delayed_job if present
    Delayed::Job.find(self.delayed_job_id).destroy if self.delayed_job_id

    # enqueue job
    dj = Delayed::Job.enqueue(
      ::FacebookJob.new(self.user,self.body,url,self.title),0,self.active_from
    )

    # save id of delayed job on radar record
    self.delayed_job_id = dj.id

  end
end
like image 194
Unixmonkey Avatar answered Oct 27 '22 18:10

Unixmonkey


did you try storing the id from the delayed job and then store it for possible deletion: e.g

job_id = Delayed::Job.enqueue(::FacebookJob.new(self.user,self.body,url,self.title),0,self.active_from)
job = Delayed::Job.find(job_id)
job.delete
like image 35
Tam Avatar answered Oct 27 '22 18:10

Tam