From 0dccc02d3cf629953f55ae223a3508ee8af7269a Mon Sep 17 00:00:00 2001 From: GUO <1923636941@qq.com> Date: Mon, 20 May 2024 10:01:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=93=E5=8D=B0mdc=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zhgd/xmgl/config/AsyncConfig.java | 2 +- .../config/MdcThreadPoolTaskExecutor.java | 64 +++++++++++++++++ .../java/com/zhgd/xmgl/config/TaskAspect.java | 68 +++++++++++++++++++ .../zhgd/xmgl/security/RequestIdFilter.java | 25 +++++++ .../com/zhgd/xmgl/util/RequestIdUtil.java | 25 +++++++ src/main/resources/logback-spring.xml | 10 +-- 6 files changed, 188 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/zhgd/xmgl/config/MdcThreadPoolTaskExecutor.java create mode 100644 src/main/java/com/zhgd/xmgl/config/TaskAspect.java create mode 100644 src/main/java/com/zhgd/xmgl/security/RequestIdFilter.java create mode 100644 src/main/java/com/zhgd/xmgl/util/RequestIdUtil.java diff --git a/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java b/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java index c66011348..fd6d32585 100644 --- a/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java +++ b/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java @@ -336,7 +336,7 @@ public class AsyncConfig { @Bean("hikvisionExecutor") public ThreadPoolTaskExecutor hikvisionExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); /** 核心线程数(默认线程数) */ executor.setCorePoolSize(1); /** 最大线程数 */ diff --git a/src/main/java/com/zhgd/xmgl/config/MdcThreadPoolTaskExecutor.java b/src/main/java/com/zhgd/xmgl/config/MdcThreadPoolTaskExecutor.java new file mode 100644 index 000000000..69eb4c6a5 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/config/MdcThreadPoolTaskExecutor.java @@ -0,0 +1,64 @@ +package com.zhgd.xmgl.config; + +import com.zhgd.xmgl.util.RequestIdUtil; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.Future; + +@Slf4j +public class MdcThreadPoolTaskExecutor extends ThreadPoolTaskExecutor { + + /** + * 接口请求开启的异步线程会调用下述方法 + */ + @Override + public void execute(Runnable task) { + Map context = MDC.getCopyOfContextMap(); //复制主线程MDC + log.info("MDC异步多线程..."); + super.execute(() -> { + if (null != context) { + MDC.setContextMap(context); //主线程MDC赋予子线程 + } else { + RequestIdUtil.setRequestId(); //主线程没有MDC就自己生成一个 + } + try { + task.run(); + } finally { + try { + RequestIdUtil.clear(); + } catch (Exception e) { + log.warn("MDC clear exception:{}", e.getMessage()); + } + } + }); + } + + /** + * 定时任务会调用下述方法 + */ + @Override + public Future submit(Callable task) { + Map context = MDC.getCopyOfContextMap(); //复制主线程MDC + log.info("MDC异步多线程..."); + return super.submit(() -> { + if (null != context) { + MDC.setContextMap(context); //主线程MDC赋予子线程 + } else { + RequestIdUtil.setRequestId(); //主线程没有MDC就自己生成一个 + } + try { + return task.call(); + } finally { + try { + RequestIdUtil.clear(); + } catch (Exception e) { + log.warn("MDC clear exception:{}", e.getMessage()); + } + } + }); + } +} diff --git a/src/main/java/com/zhgd/xmgl/config/TaskAspect.java b/src/main/java/com/zhgd/xmgl/config/TaskAspect.java new file mode 100644 index 000000000..bbd1c53f7 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/config/TaskAspect.java @@ -0,0 +1,68 @@ +package com.zhgd.xmgl.config; + +import com.zhgd.xmgl.util.RequestIdUtil; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.MDC; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.Map; + +@Aspect +@Component +@Slf4j +public class TaskAspect { + + @Pointcut("@annotation(org.springframework.scheduling.annotation.Scheduled)") + public void servicePointcut() { + System.out.println("Pointcut: 不会被执行"); + } + + @Around("servicePointcut()") + public void doAround(ProceedingJoinPoint jointPoint) throws Throwable { + Map context = MDC.getCopyOfContextMap(); //复制主线程MDC + // 获取当前访问的class类及类名 + Class clazz = jointPoint.getTarget().getClass(); + String clazzName = jointPoint.getTarget().getClass().getName(); + + // 获取访问的方法名 + String methodName = jointPoint.getSignature().getName(); + try { + + if (null == context) { + RequestIdUtil.setRequestId("-t"); //主线程没有MDC就自己生成一个 + log.info("task方法开始:{}",methodName); + } + + // 获取方法所有参数及其类型 + Object[] args = jointPoint.getArgs(); + Class[] argClz = ((MethodSignature) jointPoint.getSignature()).getParameterTypes(); + // 获取访问的方法对象 + Method method = clazz.getDeclaredMethod(methodName, argClz); + + // 判断当前访问的方法是否存在指定注解 + if (method.isAnnotationPresent(Scheduled.class)) { + Scheduled annotation = method.getAnnotation(Scheduled.class); + + // 获取注解标识值与注解描述 + // String value = annotation.value(); + // String desc = annotation.description(); + + // 执行目标方法 + Object proceed = jointPoint.proceed(); + } + } finally { + if (null == context) { + RequestIdUtil.clear(); + log.info("task方法结束:{}",methodName); + } + } + } + +} diff --git a/src/main/java/com/zhgd/xmgl/security/RequestIdFilter.java b/src/main/java/com/zhgd/xmgl/security/RequestIdFilter.java new file mode 100644 index 000000000..8012138f0 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/security/RequestIdFilter.java @@ -0,0 +1,25 @@ +package com.zhgd.xmgl.security; + +import com.zhgd.xmgl.util.RequestIdUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import java.io.IOException; + +@Slf4j +@Component +public class RequestIdFilter implements Filter { + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + RequestIdUtil.setRequestId("-i"); + log.info("接口开始..."); + try { + filterChain.doFilter(servletRequest, servletResponse); + } finally { + log.info("接口结束..."); + RequestIdUtil.clear(); + } + } +} diff --git a/src/main/java/com/zhgd/xmgl/util/RequestIdUtil.java b/src/main/java/com/zhgd/xmgl/util/RequestIdUtil.java new file mode 100644 index 000000000..676505ff4 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/util/RequestIdUtil.java @@ -0,0 +1,25 @@ +package com.zhgd.xmgl.util; + +import cn.hutool.core.util.IdUtil; +import org.slf4j.MDC; + +public class RequestIdUtil { + public static final String REQUEST_ID = "requestId"; + + public static void setRequestId() { + MDC.put(REQUEST_ID, IdUtil.fastSimpleUUID()); + } + + public static String getRequestId() { + return MDC.get(REQUEST_ID); + } + + public static void setRequestId(String s) { + MDC.put(REQUEST_ID, IdUtil.fastSimpleUUID() + s); + } + + public static void clear() { + MDC.clear(); + } + +} diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index 32d21f80b..ef9782399 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -6,7 +6,7 @@ - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %method:%L %cyan(%logger{50}) - %highlight(%msg) %n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] [%thread] %highlight(%-5level) %method:%L %cyan(%logger{50}) - %highlight(%msg) %n @@ -16,7 +16,7 @@ ${log.path}/zhgd-debug.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] [%thread] %-5level %logger{50} - %msg%n UTF-8 @@ -43,7 +43,7 @@ ${log.path}/zhgd-info.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{56}.%method:%L - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] [%thread] %-5level %logger{56}.%method:%L - %msg%n UTF-8 @@ -69,7 +69,7 @@ ${log.path}/zhgd-error.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] [%thread] %-5level %logger{50} - %msg%n UTF-8 @@ -95,7 +95,7 @@ ${log.path}/zhgd-all.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %method:%L %cyan(%logger{50}) - %highlight(%msg) %n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] [%thread] %highlight(%-5level) %method:%L %cyan(%logger{50}) - %highlight(%msg) %n UTF-8