【问题标题】:delayed_job. Delete job from queue延迟工作。从队列中删除作业
【发布时间】:2011-08-26 17:12:50
【问题描述】:
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”字段中。

上面的代码正在运行,并且作业在正确的日期执行。

但在某些情况下,我首先创建雷达对象并将一些作业发送到延迟作业队列。之后我更新此对象并将另一个作业发送到延迟作业。

这是错误的行为,因为我不想在正确的时间只执行一次作业。在这个实现中,我将执行 2 个作业。如何删除以前的作业,以便只执行更新的作业?

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

ps:对不起我的英语我尽力了

【问题讨论】:

    标签: ruby-on-rails ruby delayed-job


    【解决方案1】:

    如果雷达对象得到更新并重新排队,听起来您想取消任何作业的排队。

    Delayed::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
    

    【讨论】:

    • @Unixmonkey... 如果在after_save 回调中创建作业会怎样。
    • @Rohit after_save 会运行这个方法,delayed_job_id 不会被设置在记录上(因为你不能在 after_save 中调用 save 而不进入无限循环)
    【解决方案2】:

    您是否尝试存储延迟作业中的 id,然后将其存储以备删除: 例如

    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
    

    【讨论】:

    • 有趣的是,如果 Delayed::Worker.delay_jobs = false,这将中断,因为看起来入队操作只是运行作业,而不会将其保存到数据库中
    猜你喜欢
    • 2017-12-02
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    相关资源
    最近更新 更多