2017-06-26 1 views
1

J'ai un employé de sidekiq qui demandera une api tierce (Mailchimp) et obtiendra une réponse. Parfois, il répondra à un message d'erreur indiquant que l'api gem déclenchera une erreur.Comment éviter de réessayer pour une exception/erreur sur sidekiq

Cependant, ces erreurs sont normales et il n'est pas nécessaire de réessayer. Donc, j'aimerais que Sidekiq prévienne de réessayer lorsque ces erreurs sont soulevées.

J'ai essayé simplement rescue, mais cela n'empêchera pas le sidekiq de capturer l'erreur déclenchée.

def preform(id) 
    UpdateMailchimpService.new.(id) 
rescue 
    Mailchimp::ListInvalidBounceMemberError 
end 

Un moyen de le faire? Enfin trouvé Merci

Mise à jour

que mon problème a été causé par le cassé de notre outil de déploiement (déploiement échoué, mais pas réalisé). En fait, le Sidekiq ignorera toute erreur/exception sauvée et ils ne seront pas retentés et signalés à Bugsnag.

En Bugsnag's documentation, il dit clairement:

Bugsnag doit être installé et configuré, et sera automatiquement détecté des exceptions non gérées et devrait apparaître dans votre tableau de bord Bugsnag.

Ce post sur github n'avait pas une explication claire, c'est pourquoi je suis confus par cette question.

+0

_ "cela n'empêchera pas le sidekiq de capturer l'erreur déclenchée" _ - que voulez-vous dire par là? – Stefan

+0

@Stefan cela signifie que le sidekiq sait toujours que ce travail a causé une erreur 'ListInvalidBounceMemberError', et réessayera ce travail. – Stephen

+0

@Stephen Votre exemple de code semble invalide. Pouvez-vous donner un exemple réel. Parce que 'rescue' empêche Sidekiq de réessayer. –

Répondre

0

Votre hypothèse/exemple est incorrect. Faites la chose Ruby normale: sauver l'erreur et l'ignorer.

def perform(id) 
    begin 
    UpdateMailchimpService.new.(id) 
    rescue NormalError 
    # job will succeed normally and Sidekiq won't retry it. 
    end 
end 
+0

Salut Mike, merci pour votre réponse. le bloc 'def' peut être traité comme un bloc de début. https://stackoverflow.com/questions/1542672/how-does-one-use-rescue-in-ruby-without-the-begin-and-end-block – Stephen

+0

Et j'ai aussi essayé votre solution mais l'erreur apparaît toujours sur mon bugsnag (que je pense qu'il est réessayé) – Stephen

+0

Salut Mike, merci pour votre confirmation, je viens de trouver mon outil de déploiement ont un problème si le travailleur n'a pas déployé avec succès. Sidekiq ignorerait toute erreur récupérée. Merci pour votre bijou si merveilleux. – Stephen

1

Utilisez retry: falseadvanced option:

class UpdateMailchimpWorker 
    include Sidekiq::Worker 
    sidekiq_options retry: false # ⇐ HERE 

    def perform(id) 
    UpdateMailchimpService.new.(id) 
    end 
end 
+0

Merci pour votre réponse. le 'sidekiq_options' va changer ce travailleur totalement ne peut pas être retenter. Mais ce que je veux, c'est quand certaines erreurs ont augmenté, le travail arrête de réessayer. Mais pour d'autres, par exemple, la connexion a échoué, il va réessayer le travail. – Stephen

+0

Puis supprimez-le manuellement de la file d'attente. – mudasobwa