2011-01-19 4 views
1

(使用collectiveideaのdelayed_job)ジョブのクラス内でdelayed_jobをどのように削除しますか?

私はそれがエンキューされたので、キーワードが以来削除された場合、私は仕事自体を破壊したいキーワードの擦り傷が、仕事を持っている(つまり、ユーザーが自分のキーワードのいずれかを削除します) 。

私のような何かにキーワード検索を移動することにより、フックの前にDJの中にそれを置くしようとしていた
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 

ジョブが失敗しました私が指定したキャップ。ここで

は失敗です:

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だけで全体の再試行システムをバイパスして、できるだけ早くそれはキーワードが存在しないことを認識し、ジョブを破棄します。ただ、それは静かに例外なく失敗し、ジョブが消えてしまいます持って

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 

答えて

2

+0

今日、私は 'find_by_id'が例外を発生させないことを学びました!私は余分な説明のためにあなたの投票に最善の答えをします。あなたはdelayed_job Stackoverflowの質問をあなたの携帯電話にまっすぐにプッシュしますか? – danneu

+0

いいえ、私はちょうど集合アイデアのためのツイッター検索を行っていたとそれを見つけた! –

1

はここで例外を回避することによって、簡単な解決策です。

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

私は(find_by_idする)(見つける変更)ので、例外を発生させませんが、その代わりに、あなたが救うことができました。

この方法では、キーワードがなくなってもジョブは何もしません。例外を提起しない仕事は去るだけです。

このパターンはCollective Ideaでかなり使います。

関連する問題