J2EE之巔

           

          Spring AOP on Annotation

          1 The annotation:
          @Retention(RetentionPolicy.RUNTIME)
          @Target(ElementType.METHOD)
          @Inherited
          public @interface NeedToRetry {
              Class<?>[] recoverableExceptions();
              int retryTime();
              int intervalIncrementalFactor() default 0;
              long retryInterval() default 0L;
          }

          2 The Aspect
          @Aspect
          public class InvokingRetryInterceptor {
              private static Logger log = Logger.getLogger(InvokingRetryInterceptor.class);
              private boolean isNeedToRetry(Throwable t,Class<?>[] recoverableExceptions){
                  String exceptionName= t.getClass().getName();
                  for (Class<?> exp:recoverableExceptions){            
                      if (exp.isInstance(t)){
                          return true;
                      }
                  }
                  log.warn("The exception doesn't need recover!"+exceptionName);
                  return false;
              }

              private long getRetryInterval(int tryTimes,long interval,int incrementalFactor){
                  return interval+(tryTimes*incrementalFactor);
              }
              
              @Around(value="@annotation(amazon.internal.dropship.common.NeedToRetry)&&@annotation(retryParam)",argNames="retryParam")
              public Object process(ProceedingJoinPoint pjp,NeedToRetry retryParam ) throws Throwable{
                  boolean isNeedTry=true;
                  int count=0;
                  Throwable fault;            
                  Class<?>[] recoverableExceptions=retryParam.recoverableExceptions();
                  int retryTime=retryParam.retryTime();
                  long retryInterval=retryParam.retryInterval();
                  int incrementalFactor=retryParam.intervalIncrementalFactor();
                  do{
                      try{                
                          return pjp.proceed();            
                      }catch(Throwable t){
                          fault=t;
                          if (!isNeedToRetry(t,recoverableExceptions)){
                              break;
                          }
                          Thread.sleep(getRetryInterval(retryTime,retryInterval,incrementalFactor));
                      }
                      count++;
                  }while(count<(retryTime+1));
                  throw fault;
                  
              }
          }

          posted on 2011-06-07 11:34 超越巔峰 閱讀(4433) 評論(3)  編輯  收藏 所屬分類: Java EE

          評論

          # re: Spring AOP on Annotation[未登錄] 2011-06-07 16:24 quaff

          用spring aop有個限制就是被aop攔截的方法被this對象的另一個方法調用會繞過aop  回復  更多評論   

          # re: Spring AOP on Annotation 2011-06-15 13:42 懶人助手

          有些圖片會更好,http://www.lrtool.net  回復  更多評論   

          # re: Spring AOP on Annotation[未登錄] 2013-05-17 14:06 cc

          more examples:
          @Around("execution(public * amazon.internal.dropship.core.external.services.*Gateway*.*(..)) && (!execution(public * amazon.internal.dropship.core.external.services.*GatewayMemory*.*(..)))")

          About cast AOP proxy:
          if(AopUtils.isJdkDynamicProxy(gateway)){
          impl = (SCSGatewayImpl) ((Advised)gateway).getTargetSource().getTarget();
          }else{
          impl = (SCSGatewayImpl) gateway;
          }  回復  更多評論   

          導航

          統計

          常用鏈接

          留言簿(12)

          隨筆分類(54)

          隨筆檔案(59)

          文章分類(2)

          文章檔案(1)

          相冊

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 清水县| 宜宾县| 会同县| 苗栗市| 祁东县| 抚松县| 西安市| 吉林省| 黄龙县| 集安市| 德州市| 平凉市| 临江市| 新巴尔虎右旗| 阿拉尔市| 阿鲁科尔沁旗| 恩施市| 长宁县| 濮阳市| 嘉定区| 宁武县| 手游| 保康县| 平和县| 容城县| 镇雄县| 突泉县| 定结县| 登封市| 禄劝| 濮阳县| 延边| 遂川县| 黎平县| 台南县| 三河市| 安丘市| 普宁市| 惠东县| 沙雅县| 临西县|