springboot3.2+jdk21 虚拟线程 使用MDC traceId追踪日志

springboot3.2发布了,配合jdk21使用虚拟线程,使用MDC + traceId追踪日志方法

关于虚拟线程和MDC traceId这里就不多说了,如果不清楚请自行查询资料

第一步,创建MdcVirtualThreadTaskExecutor 


/**
 * @author xxley
 * @date 2022/7/25 15:54
 */
public class MdcVirtualThreadTaskExecutor extends TaskExecutorAdapter {
    
    public MdcVirtualThreadTaskExecutor(Executor concurrentExecutor) {
        super(concurrentExecutor);
    }

    @Override
    public <T> Future<T> submit(Callable<T> callable) {
        Map<String, String> context = MDC.getCopyOfContextMap();
        return super.submit(() -> {
            if (context != null) {
                //将父线程的MDC内容传给子线程
                MDC.setContextMap(context);
            } else {
                //直接给子线程设置MDC
                // 这个方法是我自己封装的,实际是MDC.put("traceId", traceId);
                TraceIdContext.setMCData(null);
            }
            try {
                //执行任务
                return callable.call();
            } finally {
                MDC.clear();
            }
        });
    }

    @Override
    public void execute(Runnable runnable) {
        Map<String, String> context = MDC.getCopyOfContextMap();
        super.execute(() -> {
            if (context != null) {
                //将父线程的MDC内容传给子线程
                MDC.setContextMap(context);
            } else {
                //直接给子线程设置MDC  
                // 这个方法是我自己封装的,实际是MDC.put("traceId", traceId);
                TraceIdContext.setMCData(null);
            }
            try {
                //执行任务
                runnable.run();
            } finally {
                MDC.clear();
            }
        });
    }
}
 

第二步,配置AsyncConfig  

@Configuration
@EnableAsync
public class AsyncConfig  {

   @Bean
   public TaskExecutor taskExecutor(SimpleAsyncTaskExecutorBuilder executor) {
       SimpleAsyncTaskExecutor build = executor.build();
       return new MdcVirtualThreadTaskExecutor(build);
   }
}

此时使用@Async异步调用, 在异步方法中输出的日志就会携带主线程的traceId

虚拟线程不要池化,创建和销毁虚拟线程消耗资源很低,可以忽略不计。

这是我找到的一种方法,如果你有更好的方法,请告知一下。

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Linux系统下,我们可以使用Docker来部署Spring Boot 3和JDK 17。 首先,我们需要在Linux中安装Docker。可以根据具体的Linux发行版来选择不同的安装方式。安装完成后,我们可以通过运行以下命令来验证Docker安装是否成功: ``` docker --version ``` 接下来,我们需要创建一个Docker镜像来运行我们的Spring Boot 3应用程序。首先,我们需要创建一个Dockerfile,可以使用任何文本编辑器来创建一个名为“Dockerfile”的文件。在Dockerfile中,我们可以定义我们的镜像的构建过程。以下是一个简单的Dockerfile示例: ``` FROM openjdk:17-jdk-alpine WORKDIR /app COPY target/springboot3-app.jar /app CMD ["java", "-jar", "springboot3-app.jar"] ``` 在这个Dockerfile中,我们首先选择了一个基础镜像(openjdk:17-jdk-alpine),其中包含了JDK 17的安装。然后,我们定义了工作目录为“/app”,将Spring Boot 3应用程序的JAR文件复制到工作目录中,并使用CMD命令定义了镜像启动时要运行的命令。 在创建了Dockerfile后,我们可以使用以下命令来构建Docker镜像: ``` docker build -t springboot3-app . ``` 这将会在当前目录下构建一个名为“springboot3-app”的Docker镜像。 最后,我们可以使用以下命令来运行我们的应用程序容器: ``` docker run -p 8080:8080 springboot3-app ``` 这将会将容器的8080端口映射到主机的8080端口,并运行我们的Spring Boot 3应用程序。 通过以上步骤,我们可以在Linux系统中使用Docker快速部署和运行Spring Boot 3和JDK 17。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值