在我以前的文章中,我谈到了对MongoDB批处理程序采用乐观锁定的好处。 如我之前所写,乐观锁异常是可恢复的异常,只要我们获取最新的Entity,我们就会对其进行更新并保存。
因为我们使用的是MongoDB,所以我们不必担心本地或XA事务。 在以后的文章中,我将演示如何使用JPA构建相同的机制。
Spring框架提供了很好的AOP支持,因此可以轻松实现自动重试机制,这就是我的方法。
我们首先定义一个Retry注释:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Retry {
Class<? extends Exception>[] on();
int times() default 1;
}
我们注释了我们的业务逻辑方法,例如
@Retry(times = 10, on = org.springframework.dao.OptimisticLockingFailureException.class)
public Product updateName(Long id, String name) {
Product product = productRepository.findOne(id);
product.setName(name);
LOGGER.info("Updating product {} name to {}", product, name);
return productRepository.save(product);
}
然后,我们只需要AOP方面来拦截业务逻辑调用,并在乐观锁定检测的情况下重试。
@Aspect
public class OptimisticConcurrencyControlAspect {
private static final Logger LOGGER = LoggerFactory.getLogger(OptimisticConcurrencyControlAspect.class);
@Around("@annotation(vladmihalcea.concurrent.Retry)")
public Object retry(ProceedingJoinPoint pjp