我正在使用活动作业,它运行得非常好。当我四处玩耍时,我注意到了一些东西,我正在寻找任何改进。
我有一份类似的工作:
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
分钟后用相同的original parameters
重新安排当前作业delay
。scheduling
运行良好。但是,我在数据库级别观察到了一些细微差别,并希望有所改进。
问题是创建了一个new job
,即db
表中的一个新row
。相反,我想让它作为same job
工作,只添加一些delay
(基本上我想把参数修改为re-schedule
,显然是用相同的参数修改相同的current job
(。
我确实意识到,就从事同样的工作而言,raising an error
可能会起到作用。其中一个好处是attempts
也增加了。但是,我希望能够在作业再次运行之前添加一个delay
(相同的作业,不创建新作业(。
我该怎么做?谢谢
是的,您希望重试而不是将新作业排入队列。使用类方法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