有没有办法获得当前工作的重试次数?
x重试后,我希望工作停止,而不是崩溃。我想问一下perform方法中的重试计数,所以如果重试计数等于x,我可以简单地返回。
def perform(args)
return if retry_count > 5
...
end
使用Sidekiq 2.12。
我(不是OP)有同样的问题,但原因不同。如果正在重试作业,我想进行额外的健全性检查以确保需要该作业,并且如果不再期望成功,则退出重试,因为在排队后外部发生了更改。
那么,有没有办法获得当前工作的重试次数?目前的答案只是建议你可以绕过需要的方式,或者可以从工作之外获得它。
这可以通过添加sidekiq中间件来将msg ['retry_count']设置为作业类的实例变量来实现。
添加一个中间件(在Rails中,它通常是/config/initializers/
文件夹中的文件),如下所示:
class SidekiqMiddleware
def call(worker, job, queue)
worker.retry_count = job['retry_count'] if worker.respond_to?(:retry_count)
yield
end
end
Sidekiq.configure_server do |config|
config.server_middleware do |chain|
chain.add SidekiqMiddleware
end
end
在你的工作中:
include Sidekiq::Worker
attr_accessor :retry_count
def retry_count
@retry_count || 0
end
def perform(args)
return if retry_count > 5
...
end
你不需要直接处理这个逻辑来完成你想要的。简单地为你的工人添加一些配置。注意sidekiq_options
。基于您在下面的评论“阻止Sidekiq将工作移动到死亡工作队列”
class MyWorker
include Sidekiq::Worker
sidekiq_options :retry => 5, :dead => false
def perform
#do some stuff
end
end
然后工作应该重试5次并优雅地失败。如果你想在执行5次重试后执行代码块,那么worker会有一个名为sidekiq_retries_exhausted
的方法,你可以在其中进行一些自定义日志记录等。
您可以使用Sidekiq API访问重试:
https://github.com/mperham/sidekiq/wiki/API#retries
找到你需要的工作,并使用job['retry_count']
来获得重试次数。