Java 为什么我在MDC SLF4J中获得两个请求的重复Id?
我有一个web应用程序。我的应用程序由Tomcat部署。我编写了一个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());
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
的线程池?