在实际工作过程中,重试是一个经常使用的手段。比如MQ发送消息失败,会采取重试手段,比如工程中使用RPC请求外部服务,可能因为网络
波动出现超时而采取重试手段......可以看见重试操作是非常常见的一种处理问题,系统设计的手段
而在之前我们项目中处理重拾操作依赖MQ自身的重试机制,但是这种机制不是很灵活,如果某些功能没有使用MQ的话,那么就不是那么方便了,而本文介绍的Spring-Retry却能够以一种很优雅的方式解决这种问题,当然目前版本的Spring-retry还不是完美的,还是有待改进的.不过已经很不错了.
例子1
@Configuration@EnableRetrypublic class Application { @Bean
public Service service() { return new Service();
}
}@Serviceclass Service { @Retryable(RemoteAccessException.class) public void service() { // ... do something
} @Recover
public void recover(RemoteAccessException e) { // ... panic
}
}例子2
@org.springframework.stereotype.Servicepublic class Service1 { @Retryable(value = {RemoteAccessException.class, RuntimeException.class},
maxAttempts = 2,
backoff = @Backoff(value = 2000)) public void service() {
System.out.println("do some things"); // this exception will just trigger recover1, do not trigger recover3
throw new RemoteAccessException("remote access exception"); // this exception will just trigger recover2// throw new RuntimeException("runtime exception");// System.out.println("do another things");
} // 如果使用注解的话,这个recover貌似只能写在本类中,我测试了如果将recover方法写在
// recoverService中,好像找不到
@Recover
public void recover1(RemoteAccessException e) {
System.out.println(e.getMessage());
System.out.println("do recover operation1");
} @Recover
public void recover2(RuntimeException e) {
System.out.println(e.getMessage());
System.out.println("do recover operation2");
} @Recover
public void recover3(RemoteAccessException e) {
System.out.println(e.getMessage());
System.out.println("do recover operation3");
}
}例子3
@Servicepublic class Service2 { public void test(){ final RetryTemplate retryTemplate = new RetryTemplate(); final SimpleRetryPolicy policy = new SimpleRetryPolicy(3, Collections.<Class<? extends Throwable>, Boolean>
singletonMap(Exception.class, true));
FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
fixedBackOffPolicy.setBackOffPeriod(100);
retryTemplate.setRetryPolicy(policy);
retryTemplate.setBackOffPolicy(fixedBackOffPolicy); final RetryCallback<Object, Exception> retryCallback = new RetryCallback<Object, Exception>() { public Object doWithRetry(RetryContext context) throws Exception {
System.out.println("do some thing"); //设置context一些属性,给RecoveryCallback传递一些属性
context.setAttribute("key1", "value1");
System.out.println(context.getRetryCount()); throw new Exception("exception");// return null;
}
}; // 如果RetryCallback执行出现指定异常, 并且超过最大重试次数依旧出现指定异常的话,就执行RecoveryCallback动作
final RecoveryCallback<Object> recoveryCallback = new RecoveryCallback<Object>() { public Object recover(RetryContext context) throws Exception {
System.out.println("do recory operation");
System.out.println(context.getAttribute("key1")); return null;
}
}; try { final Object execute = retryTemplate.execute(retryCallback, recoveryCallback);
} catch (Exception e) {
e.printStackTrace();
}
}
}W3c0.com 提供的内容仅用于培训。我们不保证内容的正确性。通过使用本站内容随之而来的风险与本站无关。W3c0 简体中文版的所有内容仅供测试,对任何法律问题及风险不承担任何责任。 当使用本站时,代表您已接受了本站的使用条款和隐私条款。版权所有,保留一切权利。 鲁ICP备15022115号