Вручную повторите задание в отложенном задании



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



Delayed::Job.all[0].perform


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

628   9  

9 ответов:

чтобы вручную вызвать задание

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

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

Delayed::Job.find(10).destroy
Delayed::Worker.new.run(Delayed::Job.last)

это приведет к удалению задания после его выполнения.

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

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

У меня есть метод в контроллере для целей тестирования, который просто сбрасывает все отложенные задания, когда я ударил 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

предыдущие ответы выше могут быть устаревшими. Я обнаружил, что мне нужно установить failed_at, locked_by и locked_at на ноль:

(для каждого задания нужно повторить):

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!

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

Delayed::Job.all.each{|d| d.run_at = Time.now; d.save!}

Если вы не выполнили отложенное задание, которое вам нужно повторно запустить, то вам нужно будет только выбрать их и установить все, что относится к неудачной попытке повтора в 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
Delayed::Job.all.each(&:invoke_job)

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

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!

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

Comments

    Ничего не найдено.