Rails:ActiveJob:延迟重试相同的作业

时间:2020-11-05 05:31:04

标签: ruby-on-rails ruby ruby-on-rails-6 rails-activejob

我正在使用积极的工作,并且效果很好。当我在玩耍时,我注意到了一些东西,并且正在寻找任何改进。

我的工作是:

class SomeJob < ApplicationJob
  queue_as :default

  def perform(param)

    # if condition then re-try after x minutes
    if condition
       self.class.set(:wait => x.minutes).perform_later(param)
       return
    end

    # something else
  end
end

在某些情况下,我试图在x分钟delay后使用相同的original parameters重新安排当前作业。 scheduling的效果很好。但是,我在数据库级别观察到了一些细微差别,需要改进。

问题是创建了new job,在row表中有一个新的db。相反,我想让它像same job一样工作,只是添加了一些delay(基本上我想将参数修改为re-schedule,而相同的current job具有相同的参数显然)。

我确实意识到,就从事同一工作而言,raising an error可能会成功。一件好事是attempts也增加了。但是,我希望能够在作业再次运行之前添加一个delay(相同的作业,而无需创建新的作业)。

我该怎么做?谢谢。

1 个答案:

答案 0 :(得分:1)

是的,您要重试而不是排队新工作。使用类方法on_retry

查看自定义项

更改代码,看起来像这样:

class SomeJob < ApplicationJob
  queue_as :default

  retry_on RetrySomeJobException, wait: x.minutes

  def perform(param)

    raise RetrySomeJobException if condition

    # Do the work!
  end
end