2015-02-09 8 views
9

Czy można wyłączyć automatyczne powtarzanie za pomocą funkcji ActiveJob i Sidekiq?Wyłącz automatyczne powtarzanie za pomocą funkcji ActiveJob, używanej z Sidekiq

wiem, że z Sidekiq tylko, po prostu trzeba umieścić

sidekiq_options :retry => false 

jak wspomniano tutaj: https://github.com/mperham/sidekiq/wiki/Error-Handling#configuration

ale nie wydaje się, aby pracować z ActiveJob i Sidekiq.

wiem też rozwiązanie entierly wyłączyć powtórzenie jak zaproponowano tutaj: https://stackoverflow.com/a/28216822/2431728

Ale nie jest to zachowanie muszę.

Odpowiedz

12

Ok, dzięki za odpowiedź.

Tylko dla informacji, ja też zadał pytanie w ActiveJob GitHub kwestii związanej z tym tematem: https://github.com/rails/activejob/issues/47

DHH odpowiedzieć mi rozwiązanie nie testowałem, ale że może wykonać pracę.

Personnally, w końcu umieścić to do inicjowania w celu wyłączenia Sidekiq ponawia globalnie to działa dobrze:

Sidekiq.configure_server do |config| 
    config.server_middleware do |chain| 
     chain.add Sidekiq::Middleware::Server::RetryJobs, :max_retries => 0 
    end 
end 
+4

w rzeczywistości, możesz usunąć middleware 'RetryJobs' jak pokazano [tutaj] (https://github.com/mperham/sidekiq/wiki/ Middleware # default-middleware) – gerry3

+2

Sidekiq ma wbudowany sposób wyłączania ponownych prób globalnych: 'Sidekiq.default_worker_options = {retry: 0}' – Ari

+1

@Ari Nie wierzę, że działa dla ActiveJob chociaż ... tylko dla rdzennych pracowników Sidekiq bez AJ – courtsimas

3

Nie ma sposobu, aby skonfigurować coś o Sidekiq z ActiveJob. Użyj Sidekiq Worker, jeśli nie chcesz używać wartości domyślnych.

+1

Nawet jeśli używamy inicjator, a ustawienia są następujące? Sidekiq.default_worker_options = {'backtrace' => 5, 'retry' => 3} –

1

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.

2

można dogonić wyjątek i nic nie robić, zamiast ponownie lub skonfigurować powtórzenie:

class ExampleJob < ActiveJob::Base 
    rescue_from(StandardError) do |exception| 
     Rails.logger.error "[#{self.class.name}] Hey, something was wrong with you job #{exception.to_s}"  
    end 

    def perform 
     raise StandardError, "error_message" 
    end 
    end 

    class ExampleJob < ActiveJob::Base 
    rescue_from(StandardError) do |exception| 
     retry_job wait: 5.minutes, queue: :low_priority  
    end 

    def perform 
     raise StandardError, "error_message" 
    end 
    end 

Do uruchomienia powtórzeń można użyć retry_on metoda retry_on method doc

Sidekiq wiki for retries with Active Job integration

Powiązane problemy