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