From dd6eca04963fa1b81a330e340a319dd23a4dd0fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E6=9F=922012?= <345849402@qq.com> Date: Tue, 5 Jun 2018 19:03:46 +0800 Subject: [PATCH] =?UTF-8?q?guava=E9=99=90=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 +++ .../seckill/common/aop/LimitAspect.java | 42 +++++++++++++++++++ .../seckill/common/aop/ServiceLimit.java | 17 ++++++++ .../service/impl/SeckillServiceImpl.java | 2 + .../seckill/web/SeckillController.java | 6 ++- 5 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/itstyle/seckill/common/aop/LimitAspect.java create mode 100644 src/main/java/com/itstyle/seckill/common/aop/ServiceLimit.java diff --git a/pom.xml b/pom.xml index 9413d85..6081c0d 100644 --- a/pom.xml +++ b/pom.xml @@ -105,6 +105,12 @@ org.springframework.boot spring-boot-starter-websocket + + + com.google.guava + guava + 25.1-jre + spring-boot-seckill diff --git a/src/main/java/com/itstyle/seckill/common/aop/LimitAspect.java b/src/main/java/com/itstyle/seckill/common/aop/LimitAspect.java new file mode 100644 index 0000000..0450e13 --- /dev/null +++ b/src/main/java/com/itstyle/seckill/common/aop/LimitAspect.java @@ -0,0 +1,42 @@ +package com.itstyle.seckill.common.aop; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import com.google.common.util.concurrent.RateLimiter; +/** + * 限流 AOP + * 创建者 张志朋 + * 创建时间 2015年6月3日 + */ +@Component +@Scope +@Aspect +public class LimitAspect { + ////每秒只发出5个令牌,此处是单进程服务的限流 + private static RateLimiter rateLimiter = RateLimiter.create(5.0); + + //Service层切点 限流 + @Pointcut("@annotation(com.itstyle.seckill.common.aop.ServiceLimit)") + public void ServiceAspect() { + + } + + @Around("ServiceAspect()") + public Object around(ProceedingJoinPoint joinPoint) { + Boolean flag = rateLimiter.tryAcquire(); + Object obj = null; + try { + if(flag){ + obj = joinPoint.proceed(); + } + } catch (Throwable e) { + e.printStackTrace(); + } + return obj; + } +} diff --git a/src/main/java/com/itstyle/seckill/common/aop/ServiceLimit.java b/src/main/java/com/itstyle/seckill/common/aop/ServiceLimit.java new file mode 100644 index 0000000..b38adf0 --- /dev/null +++ b/src/main/java/com/itstyle/seckill/common/aop/ServiceLimit.java @@ -0,0 +1,17 @@ +package com.itstyle.seckill.common.aop; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +/** + * 自定义注解 限流 + * 创建者 张志朋 + * 创建时间 2015年6月3日 + */ +@Target({ElementType.PARAMETER, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface ServiceLimit { + String description() default ""; +} diff --git a/src/main/java/com/itstyle/seckill/service/impl/SeckillServiceImpl.java b/src/main/java/com/itstyle/seckill/service/impl/SeckillServiceImpl.java index 496dcec..89bb763 100644 --- a/src/main/java/com/itstyle/seckill/service/impl/SeckillServiceImpl.java +++ b/src/main/java/com/itstyle/seckill/service/impl/SeckillServiceImpl.java @@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.itstyle.seckill.common.aop.ServiceLimit; import com.itstyle.seckill.common.aop.Servicelock; import com.itstyle.seckill.common.dynamicquery.DynamicQuery; import com.itstyle.seckill.common.entity.Result; @@ -56,6 +57,7 @@ public class SeckillServiceImpl implements ISeckillService { dynamicQuery.nativeExecuteUpdate(nativeSql, new Object[]{seckillId}); } @Override + @ServiceLimit @Transactional public Result startSeckil(long seckillId,long userId) { //校验库存 diff --git a/src/main/java/com/itstyle/seckill/web/SeckillController.java b/src/main/java/com/itstyle/seckill/web/SeckillController.java index 977381c..edb4223 100644 --- a/src/main/java/com/itstyle/seckill/web/SeckillController.java +++ b/src/main/java/com/itstyle/seckill/web/SeckillController.java @@ -46,7 +46,11 @@ public class SeckillController { @Override public void run() { Result result = seckillService.startSeckil(killId, userId); - LOGGER.info("用户:{}{}",userId,result.get("msg")); + if(result!=null){ + LOGGER.info("用户:{}{}",userId,result.get("msg")); + }else{ + LOGGER.info("用户:{}{}",userId,"哎呦喂,人也太多了,请稍后!"); + } } }; executor.execute(task);