Monix Observables haben die Apis .onErrorRestartIf(f: Throwable => Boolean)
und .onErrorRestart(times: Int)
. Wie kann die maximale Anzahl der Wiederholungen angegeben werden? OnErrorRestartIf?Beschränken Sie die Anzahl der Wiederholungen bei der Verwendung von .onErrorRestartIf von Monix Observable?
Antwort
Sie bauen können Ihre eigene Schleife, basierend auf onErrorHandleWith
:
def retryLimited[A](fa: Observable[A], maxRetries: Int)
(p: Throwable => Boolean): Observable[A] = {
// If we have no retries left, return the source untouched
if (maxRetries <= 0) fa else
fa.onErrorHandleWith { err =>
// If predicate holds, do recursive call
if (p(err))
retryLimited(fa, maxRetries - 1)(p)
else
Observable.raiseError(err)
}
}
Wenn Sie (ich) nicht einfache Funktionen mögen, können Sie immer einige Erweiterungsmethoden als Alternative aussetzen:
implicit class ObservableExtensions[A](val self: Observable[A])
extends AnyVal {
def onErrorRetryLimited(maxRetries: Int)
(p: Throwable => Boolean): Observable[A] =
retryLimited(self, maxRetries)(p)
}
Hinweis auf die Antwort, @JVS ist in Geist OK, kann aber Problematisch sein, weil es den gemeinsamen veränderlichen Zustand beibehält, der für kalte Observable nicht in Ordnung ist. So bemerken, was passiert, wenn man so etwas tun:
val source = Observable.suspend {
if (Random.nextInt() % 10 != 0)
Observable.raiseError(new RuntimeException("dummy"))
else
Observable(1, 2, 3)
}
val listT = source
.onErrorRestartIf(limitedRetries(AtomicInt(maxRetries), shouldRestart))
.toListL
listT.runAsync // OK
listT.runAsync // Ooops, shared state, we might not have retries left
Seien Sie vorsichtig bei wandelbar gemeinsamen Staat in beobachtbare der Betreiber. Sie können natürlich so arbeiten, aber Sie müssen sich der Gefahr bewusst sein :-)
Warnung: Dies verwendet den gemeinsamen veränderlichen Status und kann für kalte Observablen falsch sein. Siehe Alexandrus Antwort.
eine Funktion definieren, es zu tun:
def limitedRetries(maxRetries: AtomicInt, shouldRetryOnException: Throwable => Boolean): Throwable => Boolean =
ex => maxRetries.decrementAndGet() > 0 && shouldRetryOnException(ex)
Und mit dieser Funktion in onErrorRestartIf
.onErrorRestartIf(limitedRetries(AtomicInt(maxRetries), shouldRestart))
FYI, verwendet hier monix AtomicInt ...
import monix.execution.atomic.AtomicInt
- 1. Beschränken Sie die Anzahl der gleichzeitigen Verbindungen von der Serverseite?
- 2. Anzahl der Wiederholungen eines Zeichensatzes
- 3. Optimierung von Typescript (oder JavaScript) -Funktionen/-Methoden zur Reduzierung der Wiederholungen bei Verwendung von Observablen
- 4. Grep: ungültige Anzahl der Wiederholungen
- 5. Anzahl der Wiederholungen für blockbasierte UIView-Animationen
- 6. Beschränken Sie die Anzahl der Zeilen nach Gruppe
- 7. Wiederholte Anzahl von Wiederholungen von 10. Fehlgeschlagen
- 8. Beschränken Sie die Anzahl der Argumente zu main in C
- 9. Beschränken Sie Anbieter bei der Integration von Gigya in iPhone?
- 10. Beschränken Sie Proportionen bei der Größenanpassung von Bildern
- 11. Anzahl der Wiederholungen von Zeichen in Zeichenfolge in c berechnen #
- 12. Begrenzen Sie die Anzahl der von Elastic Search zurückgegebenen Ergebnisse.
- 13. Anzahl der Login-Nummern beschränken
- 14. Javascript zählt Anzahl der Wiederholungen eines Elements
- 15. Beschränken Sie die Anzahl der in CloudKit zurückgegebenen Ergebnisse.
- 16. Beschränken Sie die Anzahl der Zeilen in SQLite-Datenbank
- 17. Beschränken Sie die Anzahl der angezeigten Elemente in WPF ListView
- 18. Wie man die Anzahl der Parkettdateien steuert, die bei der Verwendung von partitionBy generiert wurden
- 19. Beschränken Sie E-Mails senden Wiederholungen in Swiftmailer
- 20. Durchschnitt und Anzahl der Wiederholungen der Spalte finden Need
- 21. Ermittlung der Anzahl der Prozessoren für die Verwendung von Openmpi
- 22. bei der Verwendung von EditorFor
- 23. jede Zeile von data.frame und geben Sie die Anzahl der Wiederholungen für jede Zeile
- 24. Wie die Anzahl der Wiederholungen eines RegexMuster specifiy
- 25. Twig - Wie eine bestimmte Anzahl von Wiederholungen
- 26. Verschmelzen bei der Verwendung von NSNotificationQueue
- 27. So steuern Sie die Anzahl der Mapper bei Verwendung von Parkett
- 28. Extremer Leistungsunterschied bei der Verwendung von DataTable.Add
- 29. Probleme bei der Verwendung von w3data.js
- 30. Inhalt leer bei der Verwendung von scrapy
Vielen Dank für den Hinweis auf dieses potentielle Problem! – JVS