Повторить попытку с помощью resilience4j не работает с некоторыми исключениями
Я использую библиотеку resilience4j, чтобы повторить некоторый код, у меня есть следующий код ниже, я ожидаю, что он будет выполняться 4 раза. Если я выбрасываю IllegalArgumentException, это работает, но если я выбрасываю ConnectException, это не так.
object Test extends App {
val retryConf = RetryConfig.custom()
.maxAttempts(4)
.retryOnException(_ => true)
//.retryExceptions(classOf[ConnectException])
.build
val retryRegistry = RetryRegistry.of(retryConf)
val retryConfig = retryRegistry.retry("test", retryConf)
val supplier: Supplier[Unit] = () => {
println("Run")
throw new IllegalArgumentException("Test")
//throw new ConnectException("Test")
}
val decoratedSupplier = Decorators.ofSupplier(supplier).withRetry(retryConfig).get()
}
Я ожидал, что повторить попытку на все исключения.
1 ответ
Решение
Вы создаете украшенного поставщика, который только ловит RuntimeExceptions
в то время как ConnectException
это не RuntimeException
:
... decorateSupplier(Retry retry, Supplier<T> supplier) {
return () -> {
Retry.Context<T> context = retry.context();
do try {
...
} catch (RuntimeException runtimeException) {
...
Смотреть через Retry.java
и выберите тот, который ловит Exception
например decorateCheckedFunction
, например
val registry =
RetryRegistry.of(RetryConfig.custom().maxAttempts(4).build())
val retry = registry.retry("my")
Retry.decorateCheckedFunction(retry, (x: Int) => {
println(s"woohoo $x")
throw new ConnectException("Test")
42
}).apply(1)
какие выводы
woohoo 1
woohoo 1
woohoo 1
woohoo 1
Exception in thread "main" java.rmi.ConnectException: Test
Лично я использую softwaremill/retry