10
votes

Rxjava: RetryQuand avec la limite de nouvelle tentative

Je suis nouveau dans la programmation réactive et réactive en général. Je dois mettre en œuvre un mécanisme de nouvelle tentative pour les opérations CAS Couchbase CAS, mais l'exemple sur le site Web de CouchBase montre une nouvelle-autre qui semble réessayer indéfiniment. Je dois avoir une nouvelle limite et réessayer compter quelque part là-bas.

La simple nouvelle tentative () fonctionnerait, car elle accepte un rétrigelimit, mais je ne veux pas que cela réessaye à toutes les exceptions, seulement sur CasmismatatchException.

Des idées? J'utilise la bibliothèque Rxjava.


0 commentaires

3 Réponses :


6
votes

RetryWhen est clairement un peu plus compliqué que simple réessayer, mais voici le gist de celui-ci:

  • Vous passez un notificationHandler Fonction à ReRYQuand qui prend un Observable et sortit un Observable
  • L'émission de ce retour observable déterminer lors de la réparation devrait se produire ou arrêter
  • Donc, pour chaque exception survenant dans le flux d'origine, si le gestionnaire émet 1 article, il y aura 1 nouvelle tentative. S'il émet 2 articles, il y aura 2 ...
  • Dès que le flux du gestionnaire émet une erreur, réessayer est abandonné.

    Utilisation de cela, vous pouvez tous les deux:

    • Travailler uniquement sur CasmismatatchExceptions : Ayez simplement votre fonction Renvoyer un Observable.Error (T) Dans d'autres cas
    • Réessayez uniquement pour un nombre spécifique de fois: Pour chaque exception, Flatmap à partir d'un Observable.Range représentant le nombre maximum de tentatives, a-t-il renvoyer un observable.Timer Utilisation de la nouvelle tentative si vous avez besoin de retards d'augmentation.

      Votre cas d'utilisation est assez proche de celui de Rxjava Doc ici


1 commentaires

Je veux utiliser Réessayer quand avec une limitation de compte. J'ai essayé Observable.Range (0, 10) mais ça ne marche pas.



9
votes

En plus de ce que Simon Brasle a dit, voici une version rapide avec backoff linéaire: xxx

Notez que "ATT" Voici un tuple qui consiste à la fois à la fois loable et le nombre de Réessions, vous pouvez donc mettre en œuvre très spécifiquement une logique de retour basée sur ces deux paramètres.

Si vous voulez en savoir plus, vous pouvez jeter un coup d'œil au Doc résilient, je suis en train d'écrire: Https://gist.github.com/daschl/db9fcc9d2b932115b679#retry-with-Delay


1 commentaires

Quelqu'un peut-il expliquer, pourquoi la colonne est requise ici? Semble que le retard ne fonctionne pas sans cela



3
votes

Revivre ce fil puisque dans le Couchbase Java SDK 2.1.2 Il existe une nouvelle façon plus simple de le faire: utilisez le rétrybuilder : xxx


2 commentaires

Pouvez-vous ajouter plusieurs exceptions différentes avec des retards différents? Et pouvez-vous également définir un délai par défaut sur tout le reste?


Non, vous devriez simplement chaîner plusieurs rétriguës, chacun avec son constructeur, comme si vous chaîneriez plusieurs blocs de capture en code impératif