package com.java110.core.aop; import com.java110.core.factory.Java110TransactionalFactory; import com.java110.core.log.LoggerFactory; import com.java110.dto.order.OrderDto; import com.java110.utils.constant.CommonConstant; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.slf4j.Logger; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.Enumeration; /** * @ClassName Java110TransactionalAop * @Description TODO * @Author wuxw * @Date 2020/7/3 22:13 * @Version 1.0 * add by wuxw 2020/7/3 **/ @Component @Aspect public class Java110TransactionalAop { private static Logger logger = LoggerFactory.getLogger(Java110TransactionalAop.class); @Pointcut("@annotation(com.java110.core.annotation.Java110Transactional)") public void dataProcess() { } /** * 初始化数据 * * @param joinPoint * @throws Throwable */ @Before("dataProcess()") public void deBefore(JoinPoint joinPoint) throws Throwable { // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); Enumeration headerNames = request.getHeaderNames(); OrderDto orderDto = new OrderDto(); while (headerNames.hasMoreElements()) { String key = (String) headerNames.nextElement(); String value = request.getHeader(key); logger.debug("请求头信息 key= " + key+",value = "+value); key = key.toLowerCase(); if (CommonConstant.APP_ID.equals(key) || CommonConstant.HTTP_APP_ID.equals(key)) { orderDto.setAppId(value); } if (CommonConstant.TRANSACTION_ID.equals(key)|| CommonConstant.HTTP_TRANSACTION_ID.equals(key)) { orderDto.setExtTransactionId(value); } if (CommonConstant.REQUEST_TIME.equals(key)|| CommonConstant.HTTP_REQ_TIME.equals(key)) { orderDto.setRequestTime(value); } if (OrderDto.O_ID.equals(key)) { orderDto.setoId(value); } if (CommonConstant.USER_ID.equals(key)|| CommonConstant.HTTP_USER_ID.equals(key)) { orderDto.setUserId(value); } } orderDto.setOrderTypeCd(OrderDto.ORDER_TYPE_DEAL); //全局事务ID申请 Java110TransactionalFactory.getOrCreateOId(orderDto); } @AfterReturning(returning = "ret", pointcut = "dataProcess()") public void doAfterReturning(Object ret) throws Throwable { // 处理完请求,返回内容 logger.debug("方法调用前执行doAfterReturning()"); } //后置异常通知 @AfterThrowing("dataProcess()") public void throwException(JoinPoint jp) { logger.debug("方法调用异常执行throwException()"); } //后置最终通知,final增强,不管是抛出异常或者正常退出都会执行 @After("dataProcess()") public void after(JoinPoint jp) throws IOException { // 接收到请求,记录请求内容 logger.debug("方法调用后执行after()"); } //环绕通知,环绕增强,相当于MethodInterceptor @Around("dataProcess()") public Object around(ProceedingJoinPoint pjp) throws Throwable { Object o = null; try { o = pjp.proceed(); //观察者不做处理 if (Java110TransactionalFactory.ROLE_OBSERVER.equals(Java110TransactionalFactory.getServiceRole())) { return o; } //完成事务 Java110TransactionalFactory.finishOId(); return o; } catch (Throwable e) { logger.error("执行方法异常", e); //回退事务 Java110TransactionalFactory.fallbackOId(); //return new BusinessDto(BusinessDto.CODE_ERROR, "内部异常" + e.getLocalizedMessage()); throw e; }finally { //清理事务信息 Java110TransactionalFactory.clearOId(); } } }