delayed_job. Удалить работу из очереди - PullRequest
7 голосов
/ 16 мая 2011
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

Я хочу выполнить метод post_on_facebook на определенную дату.Я храню эту дату в поле «active_from».

Код выше работает, и задание выполняется в правильную дату.

Но в некоторых случаях я сначала создаю объект Radar и отправляю задание в отложенное заданиеочередь.После этого я обновляю этот объект и отправляю другое задание в отложенное задание.

Это неправильное поведение, потому что я не хочу выполнять задание только один раз в правильное время.В этой реализации у меня будет 2 задания, которые будут выполнены.Как я могу удалить предыдущее задание, чтобы было выполнено только обновленное?

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

ps: извините за мой английский, я стараюсь изо всех сил

Ответы [ 2 ]

13 голосов
/ 17 мая 2011

Звучит так, будто вы хотите снять с очереди любые задания, если объект радара обновляется и ставится в очередь.

Delayed :: Job.enqueue должен возвращать запись Delayed :: Job, так что вы можете получить этот идентификатор и сохранить его обратно в запись радара (создать поле для него в документе радара), чтобы вы могли найти его снова позже легко.

Вы должны изменить его на before_save, чтобы не вводить бесконечный цикл сохранения.

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
3 голосов
/ 17 мая 2011

вы пытались сохранить идентификатор из отложенного задания, а затем сохранить его для возможного удаления: например,

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
...