不废话、、、如下
1、自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.METHOD)
public @interface ClearCache {
boolean open() default true;
}
2、刪除逻辑
@Component
@Aspect
@Slf4j
public class DoubleClearCacheAop {
@Autowired
private UserService userService;
ScheduledExecutorService task = new ScheduledThreadPoolExecutor(10, new BasicThreadFactory.
Builder().namingPattern("clearCache-schedule-pool-%d").build());
@Pointcut("@annotation(com.inspur.henan.uac.modules.open.util.ClearCache)")
private void clearCachePoint() {
}
@Around("clearCachePoint()")
public Object clearCacheAop(ProceedingJoinPoint proceeds) throws Throwable {
Method method = ((MethodSignature) proceeds.getSignature()).getMethod();
ClearCache annotation = method.getAnnotation(ClearCache.class);
Object proceed = null;
if (annotation.open()) {
IPubUser user = MsySecurityContextHolder.getUser();
if (Objects.nonNull(user)) {
userService._clearCache(user);
proceed = proceeds.proceed();
task.schedule(() -> {
userService._clearCache(user);
if (log.isInfoEnabled()) {
log.info(Thread.currentThread().getName() + ":double delete cache completed");
}
}, 2L, TimeUnit.SECONDS);
} else {
proceed = proceeds.proceed();
}
}
return proceed;
}
}