問題記錄——多線程環境接口調用返回參數紊亂問題

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章