Ho avuto questo stesso bisogno, cioè ActiveJob avvolgendo Sidekiq ma volendo sostenere max_retries. Inserisco questo in un inizializzatore. Se #max_retries viene definito su un lavoro ActiveJob, verrà utilizzato per impostare i tentativi. Se #ephemeral? è definito e restituisce true, il lavoro non verrà rieseguito e non verrà trasferito a "morto" se fallisce.
class Foobar::SidekiqClientMiddleware
def call(worker_class, msg, queue, redis_pool)
aj_job = ActiveJob::Base.deserialize(msg['args'][0]) rescue nil
msg['retry'] = aj_job.respond_to?(:max_retries) ? aj_job.max_retries : 5
msg['retry'] = false if aj_job.respond_to?(:ephemeral?) && aj_job.ephemeral?
yield
end
end
Sidekiq.configure_client do |config|
config.redis = { url: "redis://#{redis_host}:6379/12" }
config.client_middleware do |chain|
chain.add Foobar::SidekiqClientMiddleware
end
end
Sidekiq.configure_server do |config|
config.redis = { url: "redis://#{redis_host}:6379/12" }
config.client_middleware do |chain|
chain.add Foobar::SidekiqClientMiddleware
end
end
Nota: in realtà è importante aggiungere questo alla catena middleware per client e server se uno dei tuoi lavori creano nuovi posti di lavoro stessi mentre vengono eseguiti.
in realtà, puoi rimuovere il middleware 'RetryJobs' come mostrato [qui] (https://github.com/mperham/sidekiq/wiki/ Middleware # middleware predefinito) – gerry3
Sidekiq ha un modo incorporato per disattivare i tentativi globalmente: 'Sidekiq.default_worker_options = {retry: 0}' – Ari
@Ari Non credo che funzioni per ActiveJob anche se ... solo per i lavoratori nativi di Sidekiq senza AJ – courtsimas