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. p>
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. P>
Des idées? J'utilise la bibliothèque Rxjava. P>
3 Réponses :
RetryWhen est clairement un peu plus compliqué que simple réessayer, mais voici le gist de celui-ci: p>
notificationHandler CODE> Fonction à ReRYQuand qui prend un Observable code> et sortit un Observable > Li> LI> LI>
- L'émission de ce retour observable déterminer lors de la réparation devrait se produire ou arrêter li>
- 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 ... Li>
- Dès que le flux du gestionnaire émet une erreur, réessayer est abandonné. LI>
ul>
Utilisation de cela, vous pouvez tous les deux: p>
- Travailler uniquement sur
CasmismatatchExceptions Code>: Ayez simplement votre fonction Renvoyer un Observable.Error (T) Code> Dans d'autres cas LI>
- Réessayez uniquement pour un nombre spécifique de fois: Pour chaque exception, Flatmap à partir d'un
Observable.Range Code> représentant le nombre maximum de tentatives, a-t-il renvoyer un observable.Timer code> Utilisation de la nouvelle tentative si vous avez besoin de retards d'augmentation. LI>
ul>
Votre cas d'utilisation est assez proche de celui de Rxjava Doc ici p>
Je veux utiliser Réessayer quand avec une limitation de compte. J'ai essayé Observable.Range (0, 10) mais ça ne marche pas.
En plus de ce que Simon Brasle a dit, voici une version rapide avec backoff linéaire: 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. P> 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 P> p>
Quelqu'un peut-il expliquer, pourquoi la colonne est requise ici? Semble que le retard ne fonctionne pas sans cela
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 code>:
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