1. I am experimenting with adding Thread support to ScopedContext as we speak. It should be straightforward.
I am not sure we ever want to deal with ScopedValue. ScopedContext provides the same functionality plus integration with logging. Ralph > On Mar 20, 2024, at 4:22 AM, Piotr P. Karwasz <piotr.karw...@gmail.com> wrote: > > 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