【问题标题】:How do you delete a delayed_job within the job's class?你如何删除作业类中的延迟作业?
【发布时间】:2011-01-20 07:32:07
【问题描述】:

(使用collectiveidea的delayed_job)

我有一个搜索关键字的作业,但如果关键字在入队后被删除(即用户删除了他的一个关键字),我希望该作业自行销毁。

class ScrapingJob < Struct.new(:keyword_id)
  def perform
      keyword = Keyword.find(keyword_id)
      data = keyword.scrape
      keyword.details.create!(:text => data[:text])
  end
end

我试图通过将关键字查找移动到以下内容来将其放入 DJ 的前钩子中:

def before(job)
    # If keyword doesn't exist, destroy job
    begin
        @keyword = Keyword.find(keyword_id)
    rescue 'RecordNotFound'
        self.destroy
    end
end

作业失败,因此 DJ 不断重新尝试此作业,直到达到我指定的重试上限。

这是失败的原因:

Keyword Load (0.4ms)  SELECT "keywords".* FROM "keywords" 
    WHERE ("keywords"."id" = 292929) LIMIT 1
AREL (1.1ms)  UPDATE "delayed_jobs" 
    SET "last_error" = '{Couldn''t find Keyword with ID=292929
    ...
    ...

我希望 DJ 在看到关键字不存在时立即销毁作业,绕过整个重试系统。

【问题讨论】:

    标签: ruby-on-rails delayed-job


    【解决方案1】:

    只要让它无声无息地失败,工作就会消失。

    默认执行 如果关键字 = Keyword.find_by_id(keyword_id) 数据 = 关键字.scrape 关键字.details.create!(:text => data[:text]) 结尾 结尾

    我将 find() 更改为 find_by_id() 所以它不会引发异常,但您也可以进行救援。

    这样,如果关键字消失,作业就不会做任何事情。不引发异常的工作就会消失。

    我们在 Collective Idea 经常使用这种模式。

    【讨论】:

    • 好吧,今天我了解到find_by_id 不会引发异常!由于额外的解释,我会投票给你作为最佳答案。您是否会收到直接发送到手机的延迟工作 Stackoverflow 问题?
    • 不,我只是碰巧在 Twitter 上搜索 Collective Idea 并找到了它!
    【解决方案2】:

    这是一个避免异常的简单解决方案:

    class ScrapingJob < Struct.new(:keyword_id)
      def perform
          keyword = Keyword.find_by_id(keyword_id)
          unless keyword.nil?
              data = keyword.scrape
              keyword.details.create!(:text => data[:text])
          end
       end
    end
    

    【讨论】:

      猜你喜欢
      • 2011-08-26
      • 2016-03-29
      • 2012-11-28
      • 2016-10-10
      • 2012-03-29
      • 2017-12-02
      • 2011-12-14
      • 2022-11-10
      • 2020-06-21
      相关资源
      最近更新 更多