如何删除作业类中的delayed_job?

时间:2011-01-19 23:22:41

标签: ruby-on-rails delayed-job

(使用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在看到该关键字不存在时立即销毁该作业,绕过整个重试系统。

2 个答案:

答案 0 :(得分:3)

让它无声地失败,没有异常,工作就会消失。

  def perform
    if keyword = Keyword.find_by_id(keyword_id)
      data = keyword.scrape
      keyword.details.create!(:text => data[:text])
    end
  end

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

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

我们在Collective Idea中使用了这种模式。

答案 1 :(得分:1)

通过避免例外,这是一个简单的解决方案:

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
相关问题