我有一个方法,我想在SQLRecoverableException发生时重试。我用@Retryable(value={SQLRecoverableException.class})
注释了该方法,并在应用程序中启用了重试。但是,这个特定的方法包含一个try-catch块来处理RuntimeException。重试现在不起作用,因为在try-catch块中捕获了任何异常。我希望在错误处理之前重试该方法3次。这是可能的与Spring重试开箱即用,还是我必须去一个更自定义的解决方案?
With Retry不仅可以通过注释来处理,所以这可能会有所帮助:
try {
withRetry().execute(context -> {
myMethodThatCatchException();
return null;
});
} catch (RuntimeException re) {
// ..
}
private RetryTemplate withRetry() {
RetryTemplate retryTemplate = new RetryTemplate();
BackOffPolicy backOffPolicy = new FixedBackOffPolicy();
retryTemplate.setBackOffPolicy(backOffPolicy);
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(3, Collections.singletonMap(SQLRecoverableException.class, true));
retryTemplate.setRetryPolicy(retryPolicy);
return retryTemplate;
}
可以在try-catch块中捕获和重新抛出特定的异常
@Retryable(value={SQLRecoverableException.class})
void someMethod() {
try {
...
} catch (SQLRecoverableException retryable) {
// don't handle here, let it be handled by @Retryable-mechanism
throw retryable;
} catch (RuntimeException other) {
// handle other non-retryable exceptions
}
}
@Retryable(value={SQLRecoverableException.class},maxAttempts=3)
public boolean methodA(){
try{.....}
catch(RuntimeException ex){ // apart from given above one
\handle catch exception
}
}
@Recover
public boolean recoverMethodA(SQLRecoverableException a){
logger.info(a.getMessage());
return false;
}
经过一番观察,我发现-
- 当你传入一个可重试的值时,可重试的将不能工作。
- 如果你在同一个类的另一个方法中调用Retryable方法,则Retryable方法将不起作用。ex - boolean methodA()——>布尔retryableMethodB ()以防你需要在methodA上应用retryable。(如果使用控制器)