Hi Ralph, On Tue, 19 Mar 2024 at 07:45, Ralph Goers <ralph.go...@dslextreme.com> wrote: > 2. The links you provide describe the problem of passing contexts to threads > magnificently. Unfortunately, they solve it by requiring you NOT to use > standard JDK tooling for managing threads. I am not prepared to be dependent > on any specific framework other than the JDK. > ... > 3. As I stated, I am not prepared to provide a solution that is dependent on > another framework. However that framework is welcome to integrate with us.
I would propose to meet those libraries half-way: * we extend our SPI to provide a fast method to copy the contents of the ThreadLocal used by ThreadContextMap, restore it on another thread or clear it, * the `context-propagation` library integrates our newly added SPI. > 2. As I noted, adding a wrapper around a Logger doesn’t accomplish anything, > at least in terms of getting data into LogEvents. The wrapper could do something like: public void info(String message) { if (logger.isEnabled(null, Level.INFO, message)) { try (CloseableThreadContext.Instance ignored = CloseableThreadContext.putAll(context)) { logger.info(message); } } } using only Log4j API. Log4j Core could do better of course. > SLF4J has recently introduced > https://www.slf4j.org/apidocs-2.1.0-alpha0/org.slf4j/org/slf4j/MDCAmbit.html > which to me looks like a horrible way to add a “scope-based” context as it > relies on the user to perform cleanup. This is a horrible workaround of the way "try-with-resources" work, when "catch" clauses are also present. Since the resource is closed **before** the "catch" code is executed, the new context keys are no longer available in the "catch" clauses. > Java 21 introduces ScopedValues - > https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/ScopedValue.html. > It does allow ScopedValues to be passed to child threads but I haven’t > experimented with it enough yet to know how it really works. In the future we will certainly switch to this, but for now I would keep all usages of `ScopedValue` in an `o.a.l.l.experimental` package, so that users know that we can remove it any time we want. Piotr