Programing

Delayed_job에서 수동으로 작업 재시도

crosscheck 2020. 11. 23. 07:48
반응형

Delayed_job에서 수동으로 작업 재시도


Delayed :: Job의 자동 재시도 기능은 훌륭하지만 지금 수동으로 재 시도하고 싶은 작업이 있습니다. 작업 자체에서 호출 할 수있는 방법이 있습니까?

Delayed::Job.all[0].perform

또는 달리거나 뭔가. 몇 가지를 시도하고 문서를 정리했지만 작업을 수동으로 재 시도하는 방법을 알아낼 수 없었습니다.


작업을 수동으로 호출하려면

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

성공적으로 실행 된 경우 작업이 제거되지 않습니다. 수동으로 제거해야합니다.

Delayed::Job.find(10).destroy

Delayed::Worker.new.run(Delayed::Job.last)

이렇게하면 작업이 완료된 후 제거됩니다.


작업을 찾고 실행하여 말한대로 정확하게 수행 할 수 있습니다.

그러나 내가 일반적으로하는 일은 작업 프로세서가 다시 선택하도록 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를 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!

개발 환경에서를 통해 rails consoleJoe Martinez의 제안에 따라 지연된 모든 작업을 재 시도하는 좋은 방법은 다음과 같습니다.

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!

이것은 기본적으로 작업을 대기열에 다시 넣고 정상적으로 처리합니다.

참고 URL : https://stackoverflow.com/questions/3312054/manually-retry-job-in-delayed-job

반응형