本文来自网易云社区
作者:王贝
最近总是发现支付发红包优惠券发完的情况,但是发现的比较迟缓,于是乎,想加一个哨兵监控,统计了一下,组内不少需求都有发送优惠券的行为,也是经常遇到发送异常的情况,所以,想针对优惠券发送封装一个公共的方法进行调用,下面是封装的公共方法:
public CouponResponse<BatchDispatchResult> sendCoupon(List<String> reedcodeList,String accountId,AntiInfoVO antiInfoVO){
//发券dubbo接口
CouponResponse<BatchDispatchResult> couponResponseVo = couponComposeFacade.batchDispatchCouponByRedeemCodeList(reedcodeList, accountId, antiInfoVO, 1);
//哨兵监控
if(couponResponseVo != null && couponResponseVo.isNotSuccess()){
StatsTool.onIntegerKey1Value1Stats("couponSendFail", 1);
}
return couponResponseVo;
}
方法很简单,就是封装一下,加个监控,但是发现代码中调用发券dubbo接口的地方很多,要改不少地方,于是想起来面向切面编程AOP,这里先简单介绍一下AOP(引用自http://www.cnblogs.com/hongwz/p/5764917.html)。
@Aspect
public class CouponWarnAspect {
/**
* 单发
*/
@Pointcut(value = "execution(com.netease.kaola.compose.coupon.vo.CouponResponse<java.util.List<com.netease.kaola.compose.coupon.vo.CouponVO>>" +
" com.netease.kaola.compose.coupon.provider.CouponComposeFacade.*(..))")
public void couponWarnPoint(){}
/**
* 批量发送
*/
@Pointcut(value = "execution(com.netease.kaola.compose.coupon.vo.CouponResponse<com.netease.kaola.compose.coupon.vo.BatchDispatchResult>" +
" com.netease.kaola.compose.coupon.provider.CouponComposeFacade.*(..))")
public void couponBatchWarnPoint(){}
@Around(value = "couponWarnPoint()")
public CouponResponse<List<CouponVO>> couponWarn(ProceedingJoinPoint pjp) throws Throwable {
try {
CouponResponse<List<CouponVO>> couponResponse = (CouponResponse) pjp.proceed();
if(couponResponse != null && couponResponse.isNotSuccess()){
StatsTool.onIntegerKey1Value1Stats("couponSendFail",1);
}
return couponResponse;
} catch (Throwable throwable) {
StatsTool.onIntegerKey1Value1Stats("couponSendError",1);
throw throwable;
}
}
@Around(value = "couponBatchWarnPoint()")
public CouponResponse<BatchDispatchResult> couponBatchWarn(ProceedingJoinPoint pjp) throws Throwable {
try {
CouponResponse<BatchDispatchResult> couponResponse = (CouponResponse) pjp.proceed();
if(couponResponse != null && couponResponse.isNotSuccess()){
StatsTool.onIntegerKey1Value1Stats("couponBatchSendFail",1);
}
return couponResponse;
} catch (Throwable throwable) {
StatsTool.onIntegerKey1Value1Stats("couponBatchSendError",1);
throw throwable;
}
}
}
多么干净利落,这样子就不用通过动原来逻辑来添加哨兵监控了。首先定义pointcut切入点,切入点就是指定一个Adivce将被引发的一系列连接点的集合,这里根据正则匹配定义了两个切入点,第一个切入点匹配的是
com.netease.kaola.compose.coupon.provider.CouponComposeFacade里返回类型是
com.netease.kaola.compose.coupon.vo.CouponResponse<java.util.List<com.netease.kaola.compose.coupon.vo.CouponVO>>的方法,从目前系统dubbo调用看,匹配的是单个发券的方法,第二个切入点匹配的是
com.netease.kaola.compose.coupon.provider.CouponComposeFacade里返回类型是com.netease.kaola.compose.coupon.vo.CouponResponse<com.netease.kaola.compose.coupon.vo.BatchDispatchResult>的方法,从目前系统dubbo调用看,匹配的是批量发券的方法。
<aop:aspectj-autoproxy proxy-target-/>
<bean id="couponWarnAspect" ></bean>
网易云免费体验馆,0成本体验20+款云产品!
更多网易研发、产品、运营经验分享请访问网易云社区。