我有一個web應用程序。我的應用程序由Tomcat
部署。我寫了一個Servlet Filter
爲把一些數據MDC
類在SLF4J
通過下面的代碼:爲什麼我的MDC SLF4J中有兩個重複的Id?
MDC.put("Id", UUID.randomUUID().toString();
當我跑我的第二個或第三個請求應用程序,我得到重複的UUID。這種情況是串行的,並不是併發的。我認爲存在一個線程池,線程上下文不清楚。
我有一個web應用程序。我的應用程序由Tomcat
部署。我寫了一個Servlet Filter
爲把一些數據MDC
類在SLF4J
通過下面的代碼:爲什麼我的MDC SLF4J中有兩個重複的Id?
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
如果您在處理完請求後給「MDC.put」賦值,則必須使用「MDC.remove」將其刪除。這可能是使用線程局部變量實現的,而Tomcat有一個線程池,可以在不同的請求中重用腳本。那些重用的線程最終會在MDC中使用相同的線程本地值,除非您執行刪除調用。 –