On May 29, 2012, at 11:39 PM, Christian Grobmeier wrote:

> On Wed, May 30, 2012 at 8:36 AM, Christian Grobmeier
> <[email protected]> wrote:
>> On Wed, May 30, 2012 at 7:59 AM, Ralph Goers <[email protected]> 
>> wrote:
>>> As I see it, the problem is that at least some of the users seem to be
>>> expecting Log4j to magically know when to call clear. It can't. The
>>> application has to do it.
>>> 
>>> All the MDC is is a ThreadLocal where each Thread has its own Map associated
>>> with the ThreadLocal. You can get and put all you want. In a webapp, of
>>> course, if you add stuff to the MDC at the beginning of a request then you
>>> need to remove it all at the end of the request.  The normal pattern is
>>> 
>>> MDC.put(key, value);
>>> try {
>>>    call servlet
>>> } finally {
>>>   MDC.remove(key);
>>> }
>>> 
>>> The problem with this is that it still leaves an empty Map in the
>>> ThreadLocal. So when remove() removes the last element from the Map then the
>>> Map is removed from the ThreadLocal.
>> 
>> OK understood. But actually isn't this happening with this fix?
>> in remove0(key): if table isEmpty ->  call clear0()
>> In clear(): tlm.remove
>> 
>> From what I understood now we are doing what we can do. Except, we can
>> provide a FAQ description.
> 
> Addendum: It seem the Servlet.destroy() Method is the place to clear the MDC.
> http://docs.oracle.com/javaee/6/api/javax/servlet/Servlet.html#destroy()

No. Again, MDC.clear() only clears the current thread.
> 
> "This method gives the servlet an opportunity to clean up any
> resources that are being held (for example, memory, file handles,
> threads)"
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to