TL;DR: Are there any serious performance concerns to be aware of with using something like...

doFilter(ServletRequest req, ServletResponse rsp, FilterChain c) {
  final Map<String,String> ctx = ThreadContext.getContext();
  try {
    c.doFilter(req,rsp);
  } finally {
    ThreadContext.clearMap()
    if ( ! ctz.isEmpty() ) { // typically empty
      ThreadContext.putAll(ctx);
    }
  }
}

        ...

I'm dealing with a Servlet Container application where (I think) I'd like to (somewhat defensively) stash & later restore the ThreadContext Map data as the first & last actions of a ServletFilter that processes evey request.

The idea being that I want to garuntee that the only ThreadContext MDC values that exist in each (re-used) Thread when it initially starts processing a request are the ones set by the ServletContainer itself (if any) and that if any "leaked" MDC values still exist at the end of the request, I want to ensure they are cleaned up -- not just as a defensive measure against "bad code" that might call ThreadContext.put("foo",...) w/o also calling ThreadContext.remove("foo"), but also because there are some situations where modules/plugins of the application want to explicitly set MDC values that exist for the duration of the requests lifecycle - even once the module/plugin is "done" with the request (ie: userId)

This _seems_ like something that would be very commonly done -- not just in Servlet Containers but in any application where Threads get re-used to process data/messages. I assumed if I went looking I'd find lots of examples of this pattern in open source code, and/or utility classes or helper plugins that bundle up this type of "Snapshot the Context Map" logic in an AutoClosable ... but so far nothing.

Which leads me to wonder if this is because there is "enough" overhead (in the ThreadContext internals) when doing this that it's not recommended except as a last resort? (I poked around in the code a bit, but between not being much of a concrrency expert, nor a log4j expert, nor a garbage free expert - I got a little lost in being confident I understood what the impacts were in the common/uncommon case)


So ultimatley I'm just hopeing someone can give me some advice on when/if code like what I posted above would be a "bad idea" vs a "good idea" ?


-Hoss

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
For additional commands, e-mail: log4j-user-h...@logging.apache.org

Reply via email to