Методы, использующие @Retryable и @Recover, не вызывают метод @Recover с @SpringBootTest - PullRequest
0 голосов
/ 08 июня 2018

Я смотрю на некоторый код в приложении SpringBoot, используя методы @Retryable, другие методы помечены как @Recover.Когда мы запускаем все приложение и делаем удаленные вызовы, которые, как мы знаем, не сработают, он правильно вызывает метод @Recover.

Однако, когда мы запускаем тест с использованием @SpringBootTest с аналогичными условиями, он никогда не вызывает @Восстановить метод.У нас много отладочной информации.Я заметил одну ситуацию на нашем работающем сервере (не в тестовом примере), когда мы увидели что-то вроде следующего:

Exception ExhaustedRetryException: Cannot locate recovery method;

Я искал это в отладочном выводе из тестового примера, но я не сделалнайдите его.

Тестовый класс имеет следующие аннотации:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@ContextConfiguration(classes = { Application.class })

Наш класс Application имеет следующие аннотации:

@SpringBootApplication
@PropertySource("classpath:application.properties")
@ComponentScan(basePackages = "com")
@EnableAsync
@EnableRetry
@EnableCaching
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
        HazelcastAutoConfiguration.class, CacheAutoConfiguration.class, CassandraAutoConfiguration.class,
        CassandraDataAutoConfiguration.class, CassandraRepositoriesAutoConfiguration.class })

Есть ли какой-то конкретный метод вИнфраструктура Spring, через которую я могу пройти, чтобы понять, почему он не находит или, возможно, даже не ищет, метод восстановления?

Обновление :

Поэтому я понял, что когдаЯ выполняю тест в отладке, я не вижу Spring RetryTemplate в стеке трассировки.Разве это не то, что контролирует поток от метода Retryable к методу Recover?Кажется, это указывает на некоторые настройки, которые я пропускаю в тестовом классе, или, возможно, указание на то, что это просто невозможно сделать в тестовом классе (надеюсь, это не так).

Обновление:

Хорошо, мне удалось это выяснить.Это происходило потому, что я забыл добавить боб из Spring, я просто создал его вручную.Это означало, что он не был настроен на использование RetryTemplate, поэтому он никогда не пытался найти метод @Recover.После того, как я добавил «@Autowired» в переменную экземпляра в тестовом классе, он преодолел эту проблему (и столкнулся со следующей проблемой, но я ее понимаю).

1 Ответ

0 голосов
/ 08 июня 2018

Это исключение исходит от RecoverAnnotationRecoveryHandler, поэтому похоже, что повтор работает, но по какой-то причине не может найти метод восстановления.

Method method = findClosestMatch(cause.getClass());
if (method == null) {
    throw new ExhaustedRetryException("Cannot locate recovery method", cause);
}

Итак, он ищет метод, которыйсоответствует исключению.

findClosestMatch просто сканирует обнаруженные методы для метода с параметром, который соответствует.

Я предлагаю вам использовать отладчик и поставить точку останова, чтобы выяснить, почемуэто не может найти соответствие.

...