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);