Spring Boot 樂觀鎖加鎖失敗 - 整合AOP

leolztang發表於2016-04-30

Spring Boot with AOP

手頭上的專案使用了Spring Boot, 在高併發的情況下,經常出現樂觀鎖加鎖失敗的情況(OptimisticLockingFailureException,同一時間有多個執行緒在更新同一條資料)。為了減少直接向服務使用者直接返回失敗結果的情況,可以使用這種方式解決這個問題:

  • 捕獲到OptimisticLockingFailureException之後,嘗試一定次數的重試。超過重試次數再報錯
  • 為了不修改原有的業務方法的程式碼,使用AOP來實現錯誤處理功能

先通過一個RESTFul應用看看Spring Boot怎麼用AOP,之後再來處理樂觀鎖加鎖失敗的問題。關於怎麼用Spring Boot建立RESTFul應用不在這裡細說了。

1.Maven依賴包

 1     <dependencies>
 2         <dependency>
 3             <groupId>org.springframework.boot</groupId>
 4             <artifactId>spring-boot-starter-web</artifactId>
 5             <version>1.2.6.RELEASE</version>
 6         </dependency>
 7         <!-- AOP的依賴包-->
 8         <dependency>
 9             <groupId>org.springframework.boot</groupId>
10             <artifactId>spring-boot-starter-aop</artifactId>
11             <version>1.2.6.RELEASE</version>
12         </dependency>
13 
14         <dependency>
15             <groupId>junit</groupId>
16             <artifactId>junit</artifactId>
17             <scope>test</scope>
18             <version>4.12</version>
19         </dependency>
20     </dependencies>

2.建立切面定義類

請注意這裡用到的幾個標籤都是必須的,否則沒效果。
 1 @Aspect
 2 @Configuration
 3 public class HelloAspect {
 4 
 5     //切入點在實現類的方法,如果在介面,則會執行doBefore兩次
 6     @Pointcut("execution(* com.leolztang.sb.aop.service.impl.*.sayHi(..))")
 7     public void pointcut1() {
 8     }
 9 
10     @Around("pointcut1()")
11     public Object doBefore(ProceedingJoinPoint pjp) throws Throwable {
12         System.out.println("doBefore");
13         return pjp.proceed();
14     }
15 }

 

3.在應用程式配置檔案application.yml中啟用AOP

spring.aop.auto: true

 

完成之後啟動App,使用RESTFul客戶端請求http://localhost:8080/greeting/{name}就可以看到控制檯有輸出"doBefore",說明AOP已經生效了。

 原始碼地址:http://files.cnblogs.com/files/leolztang/sb.aop.tar.gz

 第二部分在這裡:http://www.cnblogs.com/leolztang/p/5450316.html

相關文章