Как вы удаляете delayed_job в классе задания? - PullRequest
1 голос
/ 20 января 2011

(с использованием delayed_job colleideaa)

У меня есть задание, которое очищает ключевое слово, но я хочу, чтобы задание уничтожило само себя, если с тех пор ключевое слово было удалено с момента его постановки в очередь (то есть пользователь удаляет одно изего ключевые слова).

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's перед подключением, переместив поиск ключевых слов в что-то вроде:

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 ]

3 голосов
/ 20 января 2011

Просто молча произойдет сбой без исключения, и задание пропадет.

  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 (), чтобы он не вызывал исключение, но в противном случае вы могли бы его спасти.

Таким образом, работа просто ничего не делает, если ключевое слово пропало.Работа, которая не вызывает исключений, просто уходит.

Мы довольно часто используем эту модель в Коллективной идее.

1 голос
/ 20 января 2011

Вот простое решение, исключив исключение:

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
...