admin管理员组文章数量:1026989
工作记录注解类
记录防止多次提交方法:
1.创建注解类
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Resubmit {
/*** 延时时间 在延时多久后可以再次提交** @return Time unit is one second*/
int delaySeconds() default 20;/*** 描述信息* @return*/
String message() default "操作频繁请稍后重试";
}
2.aop
@Slf4j
@Aspect
@Component
public class ResubmitAspect {
private final static Object PRESENT = new Object();@Around("@annotation(com.baitao.ebaymon.annotation.Resubmit)")
public Object handleResubmit(ProceedingJoinPoint joinPoint) throws Throwable {Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();//获取注解信息Resubmit annotation = method.getAnnotation(Resubmit.class);int delaySeconds = annotation.delaySeconds();String message = annotation.message();Object[] pointArgs = joinPoint.getArgs();String key = "";//获取第一个参数Object firstParam = pointArgs[0];//解析参数JSONObject data = JSONObject.parseObject(JSONObject.toJSONString(firstParam));if (firstParam != null) {StringBuffer sb = new StringBuffer();data.forEach((k, v) -> {sb.append(v);});//生成加密参数 使用了content_MD5的加密方式key = ResubmitLock.handleKey(sb.toString());}//执行锁boolean lock = false;try {//设置解锁keylock = ResubmitLock.getInstance().lock(key, PRESENT);if (lock) {//放行return joinPoint.proceed();} else {//响应重复提交异常return AjaxResult.error(message);}} finally {//设置解锁key和解锁时间ResubmitLock.getInstance().unLock(lock, key, delaySeconds);}
}
}
3.锁
@Slf4j
public class ResubmitLock {
private static final ConcurrentHashMap<String, Object> LOCK_CACHE = new ConcurrentHashMap<>(200);
private static final ScheduledThreadPoolExecutor EXECUTOR = new ScheduledThreadPoolExecutor(5, new ThreadPoolExecutor.DiscardPolicy());// private static final Cache<String, Object> CACHES = CacheBuilder.newBuilder()
// 最大缓存 100 个
// .maximumSize(1000)
// 设置写缓存后 5 秒钟过期
// .expireAfterWrite(5, TimeUnit.SECONDS)
// .build();private ResubmitLock() {
}/*** 静态内部类 单例模式** @return*/
private static class SingletonInstance {private static final ResubmitLock INSTANCE = new ResubmitLock();
}public static ResubmitLock getInstance() {return SingletonInstance.INSTANCE;
}public static String handleKey(String param) {return DigestUtils.md5Hex(param == null ? "" : param);
}/*** 加锁 putIfAbsent 是原子操作保证线程安全** @param key 对应的key* @param value* @return*/
public boolean lock(final String key, Object value) {return Objects.isNull(LOCK_CACHE.putIfAbsent(key, value));
}/*** 延时释放锁 用以控制短时间内的重复提交** @param lock 是否需要解锁* @param key 对应的key* @param delaySeconds 延时时间*/
public void unLock(final boolean lock, final String key, final int delaySeconds) {if (lock) {EXECUTOR.schedule(() -> {LOCK_CACHE.remove(key);}, delaySeconds, TimeUnit.SECONDS);}
}
}
4.使用
@Resubmit(delaySeconds = 5, message = “操作频繁”)
工作记录注解类
记录防止多次提交方法:
1.创建注解类
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Resubmit {
/*** 延时时间 在延时多久后可以再次提交** @return Time unit is one second*/
int delaySeconds() default 20;/*** 描述信息* @return*/
String message() default "操作频繁请稍后重试";
}
2.aop
@Slf4j
@Aspect
@Component
public class ResubmitAspect {
private final static Object PRESENT = new Object();@Around("@annotation(com.baitao.ebaymon.annotation.Resubmit)")
public Object handleResubmit(ProceedingJoinPoint joinPoint) throws Throwable {Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();//获取注解信息Resubmit annotation = method.getAnnotation(Resubmit.class);int delaySeconds = annotation.delaySeconds();String message = annotation.message();Object[] pointArgs = joinPoint.getArgs();String key = "";//获取第一个参数Object firstParam = pointArgs[0];//解析参数JSONObject data = JSONObject.parseObject(JSONObject.toJSONString(firstParam));if (firstParam != null) {StringBuffer sb = new StringBuffer();data.forEach((k, v) -> {sb.append(v);});//生成加密参数 使用了content_MD5的加密方式key = ResubmitLock.handleKey(sb.toString());}//执行锁boolean lock = false;try {//设置解锁keylock = ResubmitLock.getInstance().lock(key, PRESENT);if (lock) {//放行return joinPoint.proceed();} else {//响应重复提交异常return AjaxResult.error(message);}} finally {//设置解锁key和解锁时间ResubmitLock.getInstance().unLock(lock, key, delaySeconds);}
}
}
3.锁
@Slf4j
public class ResubmitLock {
private static final ConcurrentHashMap<String, Object> LOCK_CACHE = new ConcurrentHashMap<>(200);
private static final ScheduledThreadPoolExecutor EXECUTOR = new ScheduledThreadPoolExecutor(5, new ThreadPoolExecutor.DiscardPolicy());// private static final Cache<String, Object> CACHES = CacheBuilder.newBuilder()
// 最大缓存 100 个
// .maximumSize(1000)
// 设置写缓存后 5 秒钟过期
// .expireAfterWrite(5, TimeUnit.SECONDS)
// .build();private ResubmitLock() {
}/*** 静态内部类 单例模式** @return*/
private static class SingletonInstance {private static final ResubmitLock INSTANCE = new ResubmitLock();
}public static ResubmitLock getInstance() {return SingletonInstance.INSTANCE;
}public static String handleKey(String param) {return DigestUtils.md5Hex(param == null ? "" : param);
}/*** 加锁 putIfAbsent 是原子操作保证线程安全** @param key 对应的key* @param value* @return*/
public boolean lock(final String key, Object value) {return Objects.isNull(LOCK_CACHE.putIfAbsent(key, value));
}/*** 延时释放锁 用以控制短时间内的重复提交** @param lock 是否需要解锁* @param key 对应的key* @param delaySeconds 延时时间*/
public void unLock(final boolean lock, final String key, final int delaySeconds) {if (lock) {EXECUTOR.schedule(() -> {LOCK_CACHE.remove(key);}, delaySeconds, TimeUnit.SECONDS);}
}
}
4.使用
@Resubmit(delaySeconds = 5, message = “操作频繁”)
本文标签: 工作记录注解类
版权声明:本文标题:工作记录注解类 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/IT/1694665033a254782.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论