Java 为什么我在MDC SLF4J中获得两个请求的重复Id?

Java 为什么我在MDC SLF4J中获得两个请求的重复Id?,java,web,slf4j,mdc,Java,Web,Slf4j,Mdc,我有一个web应用程序。我的应用程序由Tomcat部署。我编写了一个Servlet过滤器,通过以下代码将一些数据放入MDC类的SLF4J: MDC.put(“Id”,UUID.randomuid().toString(); 当我为第二个或第三个请求运行我的应用程序时,我得到了重复的UUID。这种情况是串行的,不是并发的。我认为存在一个线程池,线程上下文不清楚。使用此结构来保证ID被删除: try { MDC.put("Id", UUID.randomUUID().toString());

我有一个web应用程序。我的应用程序由Tomcat部署。我编写了一个
Servlet过滤器
,通过以下代码将一些数据放入
MDC
类的
SLF4J

MDC.put(“Id”,UUID.randomuid().toString();


当我为第二个或第三个请求运行我的应用程序时,我得到了重复的UUID。这种情况是串行的,不是并发的。我认为存在一个线程池,线程上下文不清楚。

使用此结构来保证ID被删除:

try {
    MDC.put("Id", UUID.randomUUID().toString());

    // The rest of your code
} finally {
    MDC.remove("Id");
}
(不需要catch块)。这将保证删除此事务的
Id


另外,Tomcat当然使用线程池,这是它在请求并发时管理请求的方式。进一步阅读:

如果您用
MDC输入一个值。put
处理完请求后,您必须用
MDC.remove
删除它。这可能是使用线程局部变量实现的,Tomcat有一个线程池,它可以在不同的请求中使用踏板。那些被重用的线程最终在MDC中使用相同的线程本地值,除非您执行删除调用。谢谢。我在
MDC
上出现问题的原因是
Tomcat
的线程池?