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

Reply via email to