Я пытался реализовать логику повторов в Kotlin и Reactor на основе возможностей дополнительного пакета Reactor. Я пытаюсь передать список длительностей, и на каждом context.iteration
я получаю (iteration-1) -й элемент списка. Это работает частично , я всегда получаю IndexOutOfBoundsException
на последней итерации, что больше, чем я хотел, хотя я предоставил максимальное количество повторов - размер списка. Повторные попытки выполняются, хотя, через определенную продолжительность и «правильное» количество раз (конечно, потому что IndexOutOfBoundsException
предотвращает больше), только это исключение (и его основная причина) беспокоит меня.
Это мой пользовательский интерфейс BackOff:
interface MyCustomBackoff : Backoff {
companion object {
fun getBackoffDelay(backoffList: List<Duration>): (IterationContext<*>) -> BackoffDelay {
return { context -> BackoffDelay(backoffList[(context.iteration() - 1).toInt()]) }
}
}
}
И мое расширение Kotlin:
fun <T> Mono<T>.retryCustomBackoffs(backoffList: List<Duration>, doOnRetry: ((RetryContext<T>) -> Unit)? = null): Mono<T> {
val retry = Retry.any<T>().retryMax(backoffList.size.toLong()).backoff(MyCustomBackoff.getBackoffDelay(backoffList))
return if (doOnRetry == null) {
this.retryWhen(retry)
}
else {
this.retryWhen(retry.doOnRetry(doOnRetry))
}
}
Что мне здесь не хватает?