结论:慎用全局变量
今天在开发过程中遇到了一个问题,就是在并发过程中存在接口返回数据紊乱问题,之前百思不得其解,后来发现是因为定义了一个全局变量,在spring中因为管理的bean都是单例存在的,在并发过程中可能存在返回数据紊乱的问题
当时做了一个切面
public class LogAspect {
/**
* 出参
*/
private Object result = null;
@Pointcut("@annotation(com.ecidi.audit.annonation.LogAnnotation)")
public void logPint() {
log.info("进入切入点");
}
@Around(value = "logPint() && @annotation(logAnnotation)")
public Object around(ProceedingJoinPoint pjp, LogAnnotation logAnnotation) throws Throwable {
long startTm = System.currentTimeMillis();
LogEvent logEvent = new LogEvent();
logEvent.setUuid(uuid);
try {
log.info("系统开始访问接口:{}, 参数:{}, 操作人:{}", logEvent.getUri(), logEvent.getParamJson(),
result = pjp.proceed();
//事件结果
logEvent.setEventResult(true);
// 执行时长(毫秒)
long time = System.currentTimeMillis() - startTm;
//花费时间(毫秒)
logEvent.setCostTime(time);
log.info("接口耗时:{}, 返回结果:{}", time, result);
return result;
} catch (Throwable e) {
//异常日志添加
logEvent.setException(e.getMessage());
throw e;
} finally {
//处理审计日志
LogHandle logHandle = LogAuditEventHolder.get(logEventProperties.getLogHandlerBeanName());
logHandle.handle(logEvent);
log.info("日志消息发送成功, 日志数据:{}", JSON.toJSONString(logEvent));
}
}
因为result定义为了全局变量,所以会出现这种问题