为什么我的两个请求在我的 MDC SLF4J 中得到重复的 ID?

Why do I get a duplicate Id in my MDC SLF4J for two requests?

我有一个网络应用程序。 Tomcat 部署了我的应用程序。我写了一个 Servlet Filter 用于将一些数据放入 MDC class at SLF4J 通过以下代码:

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

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

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

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

    // The rest of your code
} finally {
    MDC.remove("Id");
}

(不需要 catch 块)。这将保证删除此交易的 Id 密钥。

此外,当然 Tomcat 使用线程池,这就是它在并发时管理请求的方式。延伸阅读:https://tomcat.apache.org/tomcat-6.0-doc/config/executor.html