加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – delayed_job.从队列中删除作业

发布时间:2020-12-17 04:29:05 所属栏目:百科 来源:网络整理
导读: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),self.active_from) end endendclas
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),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:对不起我的英语我尽力做到最好

解决方法

听起来如果雷达对象更新并重新排队,您想要将任何作业排队.

Delayed :: Job.enqueue应该返回一个Delayed :: Job记录,这样你就可以从中获取ID并将其保存回雷达记录(在雷达文档上为它创建一个字段),这样你以后就可以轻松找到它了. .

您应该将其更改为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.active_from
    )

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

  end
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读