我正在查看使用@Retryable方法的SpringBoot应用程序中的一些代码,以及其他标记为@Recover的方法。当我们运行整个应用程序并进行我们知道会失败的远程调用时,它确实正确地调用了@Recover方法。
但是,当我们使用@SpringBootTest以类似的条件运行测试时,它永远不会调用@Recover方法。我们有很多调试输出。我确实注意到我们正在运行的服务器(而不是测试用例)中有一种情况,我们看到了类似以下的情况:
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基础设施中有没有什么特别的方法,我可以一步一步看清楚为什么它找不到,或者甚至找不到recover方法?
更新
所以我意识到,当我在debug中执行测试时,我在堆栈跟踪中看不到stacktrace。这难道不是控制从Retryable方法到Recover方法的流程的原因吗?这似乎指向了我在测试类中遗漏的一些设置,或者可能表明这根本不能在测试类中完成(我希望这不是真的)。
更新
好吧,我想办法解决了这个问题。发生这种情况是因为我忽略了从Spring注入bean,我只是手动创建了一个。这意味着它没有连接到使用RetryTemplate,所以它根本不会尝试寻找@Recover方法。一旦我在test类的实例变量中添加了"@Autowired“,它就解决了这个问题(并遇到了下一个问题,但我理解这个问题)。
发布于 2018-06-09 04:16:34
该异常来自RecoverAnnotationRecoveryHandler,因此重试看起来是可操作的,但由于某些原因,它找不到恢复方法。
Method method = findClosestMatch(cause.getClass());
if (method == null) {
throw new ExhaustedRetryException("Cannot locate recovery method", cause);
}因此,它正在寻找一个与异常匹配的方法。
findClosestMatch只是简单地扫描所发现的方法,寻找具有匹配参数的方法。
我建议您使用调试器,并在其中放置一个断点,以找出它找不到匹配的原因。
https://stackoverflow.com/questions/50765883
复制相似问题