I'm working on an app where we have a decorator Log4JRunnable class that
used to wrap runnables submitted to a thread pool. It retrieves a copy of
the MDC from the submitting thread (code included below). The problem that I
am running into is that occasionally a ConcurrentModificationException is
being thrown when I iterate over the entries in the hashtable. I've looked
of the Log4J and JDK code an couldn't find anything that stuck out. I know
that this might now be a Log4J specific problem, but maybe there's something
I missed. Any insight into this would be appreciated.

Thanks in advance.

Matt


public class Log4JRunnable implements Runnable {

    private final Runnable runnable;
    private final Hashtable mdc;

    public Log4JRunnable(Runnable runnable) {
        runnable = runnable;
        mdc = (MDC.getContext() != null) ? (Hashtable) MDC.getContext
().clone() : null;
    }

    public void run() {
        if (mdc != null) {
            for (Iterator i = mdc.entrySet().iterator(); i.hasNext(); ) {
                // getting ConcurrentModificationException here
                Map.Entry entry = (Map.Entry) i.next();
                MDC.put((String) entry.getKey(), entry.getValue());
            }
        }

        runnable.run();

        if (mdc != null) {
            for (Iterator i = mdc.entrySet().iterator(); i.hasNext(); ) {
                Map.Entry entry = (Map.Entry) i.next();
                MDC.remove((String) entry.getKey());
            }
        }
    }
}

Reply via email to