异步记录日志

1.场景

有事务的情况下,记录将异常信息记录到异常表中

2.处理过程

2.1本来是加上never或者notsurport注解,然后在throw抛异常之前把异常信息插入数据库,但是未成功,抛异常时回滚

2.2finally中调用被@Async注解的方法

2.3注意 这个带@Async注解的方法要放在其他的类里边

调用代码

    public Object logHandler(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
        Method method = signature.getMethod();
        String methodName = method.getName();
        String methodDeclaringClass = method.getDeclaringClass().getSimpleName();
        Object[] args = proceedingJoinPoint.getArgs();
        String targetMethodParams= Arrays.toString(args);//TODO 入参取的不对
        long startTime = System.currentTimeMillis();
        log.info("调用方法:【{}.{}】 开始!入参是【{}】", methodDeclaringClass, methodName,targetMethodParams);
        //异常记录表
        Pf1013 pf1013 = new Pf1013();
        try {
            return proceedingJoinPoint.proceed();
        } catch (Exception exception) {
            log.error("exception,调用方法:【{}.{}】 入参是【{}】,操作人是【{}】",methodDeclaringClass, methodName,targetMethodParams,GlobalVarValueUtil.getOperCode());
            pf1013.setErrorInfo(ExceptionUtils.getStackTrace(exception).substring(0,8000));
            throw exception;
        }  finally {
            //异步存表
            flowAsyncHelper.savePlatExceptionLog(pf1013);
            log.info("调用方法:【{}.{}】 结束,耗时:{}ms, 请求参数【{}】", methodDeclaringClass, methodName,System.currentTimeMillis()-startTime,targetMethodParams);
        }
    }

async注解代码

@Component
@Slf4j
public class AsyncHelper {

    @Autowired
   private Pf1013Mapper pf1013Mapper;

    /**
     * 记录异常日志
     *
     */
    @Async//(AsyncConfig.LOCAL_FLOW_EXECUTOR)
    public void savePlatExceptionLog(Pf1013 pf1013) {
        if(StringUtils.isNotEmpty(pf1013.getErrorInfo())){
            pf1013Mapper.insert(pf1013);
        }
    }

}

奇怪的是,没有配置configuration也没有在启动类中@EnableAsync就好用了,眼睁睁看到抛出异常之后我的异常表里边就有数据了

续集来了

以上操作之后  本地确实是好用的   但是 线上确实是不好用的

所以  使用@async还是有注意事项的

1.异步方法和调用异步方法的方法不能再同一个类

2.异步方法加注解@Async,调用异步方法的方法所在类要加注解@EnableAsync

3.方法所属的类的对象需要是被Spring容器所管理的,也就是指被@Controller @Service @Repository @Component这些注解的类

 

修改方法  在上边第一段代码loghandler方法所在类上边开启异步  

因为loghandler是调用@async方法的类

异步记录日志_第1张图片

后续

另一个项目我也想异步记录日志,有一个参数我在异步之前的调用类可以获取到但是在async这个类里边获取不到,点进去看,原来这个参数存储在线程变量中,然而异步是单独开出来一个线程,所以获取不到

protected static ThreadLocalStack, Object>> contextualData = new ThreadLocalStack();

 

你可能感兴趣的:(异步记录日志)