通过线程池异步实现的目的是,尽量不去抢占主业务的资源,通过异步线程处理切面日志
1.配置多线程执行器
@Configuration
@EnableAsync
public class ExecutorConfig {
@Bean
public Executor asyncServiceExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(5);
//配置最大线程数
executor.setMaxPoolSize(10);
//配置队列大小
executor.setQueueCapacity(400);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("thread-");
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
return executor;
}
}
2.创建切面类
@Aspect
@Component
public class ControllerAspect {
@Autowired
private LogService sysLogService;
@Pointcut("execution(* com.neusoft.aaaa.*.controller..*.*(..)) && !execution(* com.bbbb.controller..*.*(..))")
public void logPointCut() {
}
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
long beginTime = System.currentTimeMillis();
String userName = "";
try{
userName = ShiroUtils.getLoginUser().getUserName();//若是退出操作,执行后就获取不到用户对象了,所以提前获取
}catch (Exception e){
}
//获取request
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();//return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//设置IP地址
String ip = IPUtils.getIpAddr(request);
//执行方法
Ob