Monix可觀測量具有頂點.onErrorRestartIf(f: Throwable => Boolean)
和.onErrorRestart(times: Int)
。如何指定它應該重試的最大次數.onErrorRestartIf?限制使用Monix Observable的.onErrorRestartIf時的重試次數?
0
A
回答
2
你可以建立你自己的循環,基於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)
}
}
如果你不喜歡簡單的功能(我),你總是可以公開一些擴展方法作爲一種替代方案:
implicit class ObservableExtensions[A](val self: Observable[A])
extends AnyVal {
def onErrorRetryLimited(maxRetries: Int)
(p: Throwable => Boolean): Observable[A] =
retryLimited(self, maxRetries)(p)
}
說明@JVS答案是在精神正常,但可是有問題的,因爲它保持共享可變狀態,這對於冷觀察者來說是不好的。所以請注意,如果你做這樣的事情會發生什麼:
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
在Observable的運營商中要小心可變的共享狀態。你當然可以這樣工作,但你必須意識到:-)
0
警告:這使用共享可變狀態,對於冷觀察對象可能不正確。見亞歷山德魯的回答。
定義一個函數來做到這一點:
def limitedRetries(maxRetries: AtomicInt, shouldRetryOnException: Throwable => Boolean): Throwable => Boolean =
ex => maxRetries.decrementAndGet() > 0 && shouldRetryOnException(ex)
而且在onErrorRestartIf
.onErrorRestartIf(limitedRetries(AtomicInt(maxRetries), shouldRestart))
僅供參考使用這個功能,使用monix AtomicInt這裏...
import monix.execution.atomic.AtomicInt
相關問題
- 1. 軟件試用 - 限制使用次數
- 2. 如何限制Spark作業失敗時的重試次數?
- 3. RxJS catch **和**重試一次Observable
- 4. rxjs observable的訂閱數量限制
- 5. 如何限制JMS DefaultMessageListenerContainer將重試消息的次數?
- 6. 使用時間戳限制不正確的登錄嘗試次數
- 7. 如何限制使用gsub時的替換次數?
- 8. 限制次數
- 9. 限制登錄嘗試次數
- 10. MRJob - 限制任務嘗試次數
- 11. 重試嘗試的最大次數
- 12. Alamofire,會話管理器限制重試次數
- 13. 什麼是使用Observable「限制」消費的最佳方式?
- 14. 試圖使用localStorage限制x次使用表格
- 15. 在C++中函數調用次數的編譯時間限制
- 16. 限制多次使用的子屬性
- 17. RxJava observable:調用onError,然後重試
- 18. 春天如何限制在消息監聽器中的重試次數
- 19. ASP.NET限制登錄重試
- 20. Firebase限制上傳重試
- 21. 設置orientdb的連接重試限制
- 22. 限制使用iPhone應用程序的次數
- 23. 保護ASP.NET應用程序使用登錄次數的限制
- 24. 限制在C#中使用雅虎YQL的調用次數
- 25. WSRequest重試次數
- 26. 將網站重定向到HTTPS並重試次數有限?
- 27. Guvnor是否限制了不成功的登錄嘗試次數?
- 28. 限制失敗的登錄嘗試次數
- 29. 試圖限制程序返回的鳴叫次數
- 30. 如何使用Observable構建限速API?
感謝您指出這個潛在的問題! – JVS