Повторить попытку с помощью resilience4j не работает с некоторыми исключениями - PullRequest
2 голосов
/ 25 июня 2019

Я использую библиотеку 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 Ответ

1 голос
/ 25 июня 2019

Вы создаете оформленного поставщика , который только ловит 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 / повтор

...