我正在学习Spring Retry,并且对其功能有以下疑问:
我有一个连接到第三方应用程序API的函数。预计这会引发不同的异常,例如超时或IO异常。我试图查看spring的重试模板是否能够处理“每个”事件中的此类嵌套异常。例如,当我们将个别异常的maxAttempts设置为3时,即使每次重试也要尝试3次。例如,在尝试1时-发生异常1,而下一次尝试(尝试2)成功,但是现在发生了异常2,根据retryPolicy,它应该为异常2发起尝试1。
这可能吗?
基于一个小的POC,我看到即使同时抛出了两种类型,它也只尝试了3次:
带有retryTemplate的控制器类:
retryTemplate.execute(new RetryCallback<Customer, Exception>(){
@Override
public Customer doWithRetry(RetryContext arg0) throws Exception{
System.out.println("count #"+arg0.getRetryCount());
if(arg0.getRetryCount()>0) {
System.out.println("throwable getClass Canonical Name "+arg0.getLastThrowable().getClass().getCanonicalName());
}
return customerService.getCustomerDetails(choice);
}});
异常模拟类:
Random r = new Random();
int i = r.nextInt();
i+=1;
System.out.println("value of i "+i);
if(i%2==0) {
throw new Exception1();
}
else {
throw new Exception2();
}
以下是日志:
count #0
in getCustomerDetails
value of i -1050226395
count #1
throwable getClass Canonical Name Exception1
in getCustomerDetails
value of i 824190506
count #2
throwable getClass Canonical Name Exception2
in getCustomerDetails
value of i 1210506150
Exception1
预期结果:每次发生该异常,都尝试3次
实际结果:仅尝试总计3次。
下面是我的RetryPolicy:ExceptionClassifierRetryPolicy具有两种类型的异常的policyMap
public RetryTemplate retryTemplate() {
RetryTemplate retryTemplate = new RetryTemplate();
final SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy();
simpleRetryPolicy.setMaxAttempts(3);
FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
backOffPolicy.setBackOffPeriod(1500);
final Map<Class<? extends Throwable>, RetryPolicy> policyMap = new HashMap<>();
policyMap.put(Exception1.class, simpleRetryPolicy);
policyMap.put(Exception2.class, simpleRetryPolicy);
final ExceptionClassifierRetryPolicy retryPolicy = new ExceptionClassifierRetryPolicy();
retryPolicy.setPolicyMap(policyMap);
retryTemplate.setBackOffPolicy(backOffPolicy);
retryTemplate.setRetryPolicy(retryPolicy);
return retryTemplate;
}
问题:
请指导。
答案 0 :(得分:2)
您可以使用ExceptionClassifierRetryPolicy,但请确保为每种异常类型分配const auth = await authorize(accessToken);
const gmail = google.gmail({
version: 'v1',
auth
});
var rawText = makeBody("This is subject", "This is message", "test@gmail.com");
var res = await gmail.users.drafts.create({
'userId': 'me',
'resource': {
'message': {
'raw': rawText
}
}
});
的不同实例:
SimpleRetryPolicy