結論:慎用全局變量
今天在開發過程中遇到了一個問題,就是在併發過程中存在接口返回數據紊亂問題,之前百思不得其解,後來發現是因爲定義了一個全局變量,在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定義爲了全局變量,所以會出現這種問題