问题记录——多线程环境接口调用返回参数紊乱问题

结论:慎用全局变量
今天在开发过程中遇到了一个问题,就是在并发过程中存在接口返回数据紊乱问题,之前百思不得其解,后来发现是因为定义了一个全局变量,在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定义为了全局变量,所以会出现这种问题

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