Я смотрю на некоторый код в приложении 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» в переменную экземпляра в тестовом классе, он преодолел эту проблему (и столкнулся со следующей проблемой, но я ее понимаю).