Использование исключения Expression в Spring Retry - PullRequest
0 голосов
/ 28 апреля 2020

Согласно документации, я могу использовать что-то подобное в exceptionExpression: @Retryable(exceptionExpression="message.contains('this can be retried')")

Но я хочу получить тело ответа и проверить в нем сообщение (от RestClientResponseException), что-то похожее на это : exceptionExpression = "getResponseBodyAsString().contains('important message')"

Я пытался так, но это не работает. Итак, возможно ли сделать нечто подобное и проверить информацию из responseBody?


Редактировать: Добавление целых @Retryable параметров аннотации с предложением Гари Рассела:

@Retryable(value = HttpClientErrorException.class, exceptionExpression = "#{#root instanceof T(org.springframework.web.client.HttpClientErrorException) AND responseBodyAsString.contains('important message')}")

Я использую фактический подкласс RestClientResponseException, который я ловлю, но все еще не запускаю повторную попытку.

1 Ответ

0 голосов
/ 28 апреля 2020

В текущем выпуске для выражения неправильно требуются * * * * отметки шаблона; они не понадобятся в 1.3.

@Retryable(exceptionExpression = "#{responseBodyAsString.contains('foo')}")

Однако вы не можете использовать это выражение, если есть свойства include или exclude, поэтому выражение должно проверять тип:

@Retryable(exceptionExpression =
        "#{#root instanceof T(org.springframework.web.client.RestClientResponseException) "
        + "AND responseBodyAsString.contains('foo')}")

РЕДАКТИРОВАТЬ

@SpringBootApplication
@EnableRetry
public class So61488237Application {

    public static void main(String[] args) {
        SpringApplication.run(So61488237Application.class, args).close();
    }

    @Bean
    public ApplicationRunner runner(Foo foo) {
        return args -> {
            try {
                foo.test(1, "foo.");
            }
            catch (Exception e) {
            }
        };
    }

}

@Component
class Foo {

    @Retryable(exceptionExpression =
            "#{#root instanceof T(org.springframework.web.client.RestClientException) "
            + "AND responseBodyAsString.contains('foo')}")
    public void test(int val, String str) {
        System.out.println(val + ":" + str);
        throw new RestClientResponseException("foo", 500, "bar", new HttpHeaders(), "foo".getBytes(),
                StandardCharsets.UTF_8);
    }

 }
1:foo.
1:foo.
1:foo.
...