Повторите задание вручную в Delayed_job - PullRequest
61 голосов
/ 22 июля 2010

Задержка :: Функция автоматического повтора задания великолепна, но есть задание, которое я хочу повторить вручную.Есть ли метод, который я могу вызвать на самой работе, как ...

Delayed::Job.all[0].perform

или запустить, или что-то.Я попробовал несколько вещей и прочесал документацию, но не мог понять, как выполнить ручную повторную попытку задания.

Ответы [ 9 ]

97 голосов
/ 26 октября 2010

Для ручного вызова задания

Delayed::Job.find(10).invoke_job # 10 is the job.id

Это не удаляет задание, если оно успешно выполнено.Вам необходимо удалить его вручную:

Delayed::Job.find(10).destroy
27 голосов
/ 04 сентября 2015
Delayed::Worker.new.run(Delayed::Job.last)

Это удалит задание после его завершения.

11 голосов
/ 23 июля 2010

Вы можете сделать это точно так, как вы сказали, найдя работу и выполнив работу.

Однако обычно я просто возвращаю run_at обратно, чтобы процессор заданий снова его забрал.

8 голосов
/ 07 сентября 2012

У меня есть метод в контроллере для целей тестирования, который просто сбрасывает все отложенные задания, когда я нажимаю на URL.Не супер элегантно, но прекрасно работает для меня:

# For testing purposes
  def reset_all_jobs
    Delayed::Job.all.each do |dj|
      dj.run_at = Time.now - 1.day
      dj.locked_at = nil
      dj.locked_by = nil
      dj.attempts = 0
      dj.last_error = nil
      dj.save
    end
    head :ok
  end
6 голосов
/ 21 марта 2013

Предыдущие ответы могут быть устаревшими.Я обнаружил, что мне нужно установить значения fail_at, locked_by и locked_at на nil:

(для каждой работы, которую вы хотите повторить):

d.last_error = nil
d.run_at = Time.now
d.failed_at = nil
d.locked_at = nil
d.locked_by = nil
d.attempts = 0
d.failed_at = nil # needed in Rails 5 / delayed_job (4.1.2)
d.save!
4 голосов
/ 30 января 2016

если вы провалили отложенное задание, которое вам нужно перезапустить, вам нужно будет только выбрать их и установить все, что относится к неудачной повторной попытке, в null:

Delayed::Job.where("last_error is not null").each do |dj|
  dj.run_at = Time.now.advance(seconds: 5)
  dj.locked_at = nil
  dj.locked_by = nil
  dj.attempts = 0
  dj.last_error = nil
  dj.failed_at = nil
  dj.save  
end
4 голосов
/ 28 февраля 2013

В среде разработки через rails console, следуя совету Джо Мартинеса, хороший способ повторить все отложенные задания:

Delayed::Job.all.each{|d| d.run_at = Time.now; d.save!}
2 голосов
/ 09 июня 2015
Delayed::Job.all.each(&:invoke_job)
1 голос
/ 29 декабря 2017

Поместите это в файл инициализатора!

module Delayed
  module Backend
    module ActiveRecord
      class Job
        def retry!
          self.run_at = Time.now - 1.day
          self.locked_at = nil
          self.locked_by = nil
          self.attempts = 0
          self.last_error = nil
          self.failed_at = nil
          self.save!
        end
      end
    end
  end
end

Тогда вы можете запустить Delayed::Job.find(1234).retry!

Это в основном поместит задание обратно в очередь и обработает его в обычном режиме.

...