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:对不起我的英语我尽力做到最好
答案 0 :(得分:13)
如果雷达对象得到更新并重新排队,听起来你想要将任何作业排队。
延迟:: Job.enqueue应该返回一个Delayed :: Job记录,这样你就可以从中获取ID并将其保存回Radar记录(在雷达文档上为它创建一个字段),这样你就可以找到它之后再轻松。
您应该将其更改为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
答案 1 :(得分:3)
您是否尝试存储延迟作业中的ID,然后将其存储以供删除: 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