2015-07-21 43 views
2

我有一個web應用程序。我的應用程序由Tomcat部署。我寫了一個Servlet Filter爲把一些數據MDC類在SLF4J通過下面的代碼:爲什麼我的MDC SLF4J中有兩個重複的Id?

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

當我跑我的第二個或第三個請求應用程序,我得到重複的UUID。這種情況是串行的,並不是併發的。我認爲存在一個線程池,線程上下文不清楚。

+1

如果您在處理完請求後給「MDC.put」賦值,則必須使用「MDC.remove」將其刪除。這可能是使用線程局部變量實現的,而Tomcat有一個線程池,可以在不同的請求中重用腳本。那些重用的線程最終會在MDC中使用相同的線程本地值,除非您執行刪除調用。 –

回答

2

使用此結構來保證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

+0

這意味着我理解正確:Tomcat使用線程池? – MJM

+0

@MJM看我的編輯。 – durron597

+0

謝謝。你在'MDC'上問題的原因是'Tomcat'的線程池? – MJM

相關問題