1,创建Log注解
import java.lang.annotation.*;
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
String accessType() default "";
}
2,创建线程类(在方法执行之后单独起一个线程执行)
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ThreadPoolManager {
// 线程池对象
private final ExecutorService executorService;
// 构造函数,初始化线程池
private ThreadPoolManager(int poolSize) {
// 使用Executors工厂类来创建一个固定大小的线程池
this.executorService = Executors.newFixedThreadPool(poolSize);
}
public static final ThreadPoolManager poolManager = new ThreadPoolManager(5);
// 提交任务到线程池
public void executeTask(Runnable task) {
executorService.execute(task);
}
// 关闭线程池
public void shutdown() {
// 关闭线程池,不再接受新任务,但已提交的任务会继续执行
executorService.shutdown();
try {
// 等待一定时间让已提交的任务完成执行
if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
// 超时后强制关闭
executorService.shutdownNow();
}
} catch (InterruptedException e) {
// 如果等待过程中线程被中断,则也尝试强制关闭
executorService.shutdownNow();
// 保留中断状态
Thread.currentThread().interrupt();
}
}
// 获取线程池的当前状态
public String getStatus() {
if (executorService.isShutdown()) {
return "Shutdown";
} else if (executorService.isTerminated()) {
return "Terminated";
} else {
return "Active";
}
}
}
3,实现Aspect
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.ZoneId;
@Aspect
@Component
public class LogAspect {
@Autowired
private DataLogService dataLogService;
@Autowired
private AccessDynamicLogService accessDynamicLogService;
//正常
@AfterReturning(pointcut = "@annotation(log)")
public void doAfterReturning(Log log) {
if (StringUtils.isNoneBlank(log.accessType())) {
AccessDynamicLog accessLog = new AccessDynamicLog();
accessLog.setAccessType(log.accessType());
accessLog.setCreator(ThreadLocalUtil.get("username").toString());
accessLog.setCreateId(ThreadLocalUtil.get("userId").toString());
accessLog.setCreateTime(LocalDateTime.now(ZoneId.of("Asia/Shanghai")));
accessLog.setDeptId(ThreadLocalUtil.get("deptId").toString());
accessLog.setIp(ThreadLocalUtil.get("userIp").toString());
accessLog.setStatus(AccessStatusEnum.ACCESS_SUCCESS);
ThreadPoolManager.poolManager.executeTask(() -> accessDynamicLogService.addLog(accessLog));
}
}
//异常
@AfterThrowing(pointcut = "@annotation(log)")
public void doAfterThrowing(Log log) {
if (StringUtils.isNoneBlank(log.accessType())) {
AccessDynamicLog accessLog = new AccessDynamicLog();
accessLog.setAccessType(log.accessType());
accessLog.setCreator(ThreadLocalUtil.get("username").toString());
accessLog.setCreateId(ThreadLocalUtil.get("userId").toString());
accessLog.setCreateTime(LocalDateTime.now(ZoneId.of("Asia/Shanghai")));
accessLog.setDeptId(ThreadLocalUtil.get("deptId").toString());
accessLog.setIp(ThreadLocalUtil.get("userIp").toString());
accessLog.setStatus(AccessStatusEnum.ACCESS_FAIL);
ThreadPoolManager.poolManager.executeTask(() -> accessDynamicLogService.addLog(accessLog));
}
}
}
4,具体的业务impl业务处理
然后写你的impl业务层代码。