miałem tę samą potrzebę, czyli ActiveJob zawijania Sidekiq ale chcąc wesprzeć max_retries. Wstawiłem to do inicjalizatora. Jeśli zdefiniowano #max_retries w zadaniu ActiveJob, zostanie użyte do ustawienia ponownych prób. Jeśli #ephemeral? jest zdefiniowane i zwraca true, zadanie nie zostanie ponownie uruchomione i nie zostanie przeniesione do "dead", jeśli zawiedzie.
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
Uwaga: to rzeczywiście jest ważne, aby dodać do łańcucha middleware zarówno dla klienta, jak i serwera, czy któryś z twoich zadań tworzenia nowych miejsc pracy same jak są one wykonywane.
w rzeczywistości, możesz usunąć middleware 'RetryJobs' jak pokazano [tutaj] (https://github.com/mperham/sidekiq/wiki/ Middleware # default-middleware) – gerry3
Sidekiq ma wbudowany sposób wyłączania ponownych prób globalnych: 'Sidekiq.default_worker_options = {retry: 0}' – Ari
@Ari Nie wierzę, że działa dla ActiveJob chociaż ... tylko dla rdzennych pracowników Sidekiq bez AJ – courtsimas